的错误是:
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