的錯誤是:
panic: runtime error: index out of range
goroutine 1 [running]:
encoding/base64.(*Encoding).Encode(0xc420056000, 0x0, 0x0, 0x0, 0xc42003bf30, 0xe, 0x20)
/usr/lib/go/src/encoding/base64/base64.go:113 +0x27b
main.main()
/home/martin/a.go:11 +0x9b
exit status 2
shell returned 1
如果我們看一下/usr/lib/go/src/encoding/base64/base64.go
線113,我們看到(略):
n := (len(src)/3) * 3
for si < n {
// [..]
dst[di+0] = enc.encode[val>>18&0x3F]
dst[di+0] = enc.encode[val>>18&0x3F]
dst[di+1] = enc.encode[val>>12&0x3F]
// [..]
}
換句話說,這個功能直接將索引設置dst
。 var encodedData []byte
的長度爲零,因此您會收到index out of range
錯誤。
一個解決它的方法是將行更改爲:
encodedData := make([]byte, base64.StdEncoding.EncodedLen(len(data)))
這將使得大小的數組中的第二個參數。 Base64編碼的數據比輸入大,因此base64.StdEncoding.EncodedLen()
。
但是,這並不是解決問題的最佳方法。 The documentation提及:
編碼不適用於大數據流的各個塊。改用NewEncoder()。
重寫代碼以NewEncoder()
看起來像:
func main() {
data := []byte("string of data")
encodedData := &bytes.Buffer{}
encoder := base64.NewEncoder(base64.StdEncoding, encodedData)
defer encoder.Close()
encoder.Write(data)
fmt.Println(encodedData)
}
還有一些其他有用的功能,諸如EncodeToString()
這使得上述一點更短和更方便的:encodedData := base64.StdEncoding.EncodeToString(data)
。
感謝您的深入解答!那麼編碼數據將如何被解碼? – jsc
我相信你可以找到這個問題的答案[在文檔中](https://golang.org/pkg/encoding/base64/)@jscionti :-) – Carpetsmoker