Я хотел бы использовать Decode
(https://golang.org/pkg/encoding/base64/#Encoding.Decode) для декодирования фрагмента байтов и задавался вопросом, учитывая сигнатуру этого метода,
func (enc *Encoding) Decode(dst, src []byte) (n int, err error)
, как выбрать размерdst
кусок байтов должен быть достаточно большим, чтобы захватить вывод. Например, этот фрагмент (адаптированный из https://golang.org/pkg/encoding/base64/#Encoding.DecodeString)
package main
import (
"encoding/base64"
"fmt"
)
func main() {
str := "c29tZSBkYXRhIHdpdGggACBhbmQg77u/"
dst := make([]byte, 1024)
_, err := base64.StdEncoding.Decode(dst, []byte(str))
if err != nil {
fmt.Println("error:", err)
return
}
fmt.Printf("%s\n", dst)
}
печатает
some data with and
Однако, если явыбирая размер dst
слишком мал (например, 0
), я получаю index out of range
панику:
panic: runtime error: index out of range
goroutine 1 [running]:
encoding/base64.(*Encoding).decodeQuantum(0xc000084000, 0x1193018, 0x0, 0x0, 0xc000080f30, 0x20, 0x20, 0x4, 0x10, 0x10, ...)
/usr/local/Cellar/go@1.12/1.12.12/libexec/src/encoding/base64/base64.go:352 +0x567
encoding/base64.(*Encoding).Decode(0xc000084000, 0x1193018, 0x0, 0x0, 0xc000080f30, 0x20, 0x20, 0xc000080f38, 0x105779d, 0x10b16e0)
/usr/local/Cellar/go@1.12/1.12.12/libexec/src/encoding/base64/base64.go:500 +0x5aa
main.main()
/Users/kurt/Documents/Scratch/base64_decode.go:11 +0xb4
exit status 2
Как выбрать размер dst
в зависимости от размера src
надежно декодировать ввод?