Nhúng tệp văn bản
Nếu chúng ta đang nói về các tệp văn bản, chúng có thể dễ dàng được nhúng vào chính mã nguồn. Chỉ cần sử dụng dấu ngoặc kép để khai báo string
chữ như sau:
const html = `
<html>
<body>Example embedded HTML content.</body>
</html>
`
// Sending it:
w.Write([]byte(html)) // w is an io.Writer
Mẹo tối ưu hóa:
Vì hầu hết các trường hợp, bạn chỉ cần ghi tài nguyên vào một io.Writer
, bạn cũng có thể lưu trữ kết quả của một []byte
chuyển đổi:
var html = []byte(`
<html><body>Example...</body></html>
`)
// Sending it:
w.Write(html) // w is an io.Writer
Chỉ có điều bạn phải cẩn thận là các ký tự chuỗi thô không thể chứa ký tự dấu ngoặc kép (`). Các ký tự chuỗi thô không thể chứa các chuỗi (không giống như các ký tự chuỗi được thông dịch), vì vậy nếu văn bản bạn muốn nhúng có chứa các dấu ngoặc kép, bạn phải ngắt chuỗi thô theo nghĩa đen và nối các dấu ngoặc kép dưới dạng các ký tự chuỗi được diễn giải, như trong ví dụ này:
var html = `<p>This is a back quote followed by a dot: ` + "`" + `.</p>`
Hiệu suất không bị ảnh hưởng, vì những nối này sẽ được thực thi bởi trình biên dịch.
Nhúng tệp nhị phân
Lưu trữ dưới dạng một lát byte
Đối với các tệp nhị phân (ví dụ: hình ảnh) nhỏ gọn nhất (liên quan đến kết quả nhị phân gốc) và hiệu quả nhất là có nội dung của tệp dưới dạng []byte
mã nguồn của bạn. Điều này có thể được tạo bởi toos / thư viện của bên thứ 3 như go-bindata .
Nếu bạn không muốn sử dụng thư viện của bên thứ 3 cho việc này, thì đây là đoạn mã đơn giản đọc tệp nhị phân và xuất ra mã nguồn Go khai báo một loại biến []byte
sẽ được khởi tạo với nội dung chính xác của tệp:
imgdata, err := ioutil.ReadFile("someimage.png")
if err != nil {
panic(err)
}
fmt.Print("var imgdata = []byte{")
for i, v := range imgdata {
if i > 0 {
fmt.Print(", ")
}
fmt.Print(v)
}
fmt.Println("}")
Ví dụ đầu ra nếu tệp sẽ chứa byte từ 0 đến 16 (hãy thử nó trên Go Playground ):
var imgdata = []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}
Lưu trữ dưới dạng cơ sở64 string
Nếu tệp không "quá lớn" (hầu hết các hình ảnh / biểu tượng đều đủ điều kiện), thì cũng có các tùy chọn khả thi khác. Bạn có thể chuyển đổi nội dung của tệp thành Base64 string
và lưu trữ trong mã nguồn của bạn. Khi khởi động ứng dụng ( func init()
) hoặc khi cần, bạn có thể giải mã nó về []byte
nội dung gốc . Go có hỗ trợ tốt cho mã hóa Base64 trong encoding/base64
gói.
Chuyển đổi tệp (nhị phân) sang base64 string
đơn giản như sau:
data, err := ioutil.ReadFile("someimage.png")
if err != nil {
panic(err)
}
fmt.Println(base64.StdEncoding.EncodeToString(data))
Lưu trữ chuỗi base64 kết quả trong mã nguồn của bạn, ví dụ: dưới dạng const
.
Giải mã nó chỉ là một lệnh gọi hàm:
const imgBase64 = "<insert base64 string here>"
data, err := base64.StdEncoding.DecodeString(imgBase64) // data is of type []byte
Lưu trữ như đã trích dẫn string
Hiệu quả hơn lưu trữ dưới dạng base64, nhưng có thể lâu hơn trong mã nguồn là lưu trữ chuỗi được trích dẫn của dữ liệu nhị phân. Chúng ta có thể lấy dạng trích dẫn của bất kỳ chuỗi nào bằng cách sử dụng strconv.Quote()
hàm:
data, err := ioutil.ReadFile("someimage.png")
if err != nil {
panic(err)
}
fmt.Println(strconv.Quote(string(data))
Đối với dữ liệu nhị phân chứa các giá trị từ 0 đến 64, đây là kết quả đầu ra trông như thế nào (hãy thử trên Go Playground ):
"\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?"
(Lưu ý rằng strconv.Quote()
thêm và thêm dấu ngoặc kép vào nó.)
Bạn có thể sử dụng trực tiếp chuỗi được trích dẫn này trong mã nguồn của mình, ví dụ:
const imgdata = "\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?"
Nó đã sẵn sàng để sử dụng, không cần phải giải mã nó; việc hủy trích dẫn được thực hiện bởi trình biên dịch Go, tại thời điểm biên dịch.
Bạn cũng có thể lưu trữ nó dưới dạng một byte Slice nếu bạn cần nó như vậy:
var imgdata = []byte("\x00\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?")