base64编码用encodetostring最直接,需防nil切片和空数据返回””;解码用decodestring并严格校验错误,注意url安全变体与填充差异;大文件应使用newencoder/newdecoder流式处理,close不可省;urlencoding与rawurlencoding不兼容,跨语言需统一填充约定。
Base64编码:用EncodeToString最直接
对一段字节数据做标准Base64编码,encoding/base64包里最常用的是EncodeToString函数。它接收[]byte,返回string,无需手动处理缓冲区。
常见错误是传入nil切片或未检查原始数据是否为空——这不会panic,但会返回空字符串"",容易被当成成功结果掩盖逻辑问题。
- 如果原始数据来自
json.Marshal或io.ReadAll,务必先判断err和len(data) == 0 - 中文、emoji等UTF-8字符需先转为
[]byte再编码,不能直接对string调用EncodeToString(虽然Go允许,但语义上应明确字节意图) - 标准编码使用
base64.StdEncoding;URL安全场景改用base64.URLEncoding,二者编码结果不兼容
Base64解码:用DecodeString并严格校验错误
DecodeString看似简单,但实际出错率远高于编码。典型错误信息如illegal base64 data at input byte X,往往因为输入含空白符、换行、或用了错误的编码变体(比如前端传了URL-safe编码,后端却用StdEncoding解)。
- 解码前建议用
strings.TrimSpace清理首尾空格和换行 - 不要忽略返回的
error——即使只做日志,也要区分base64.CorruptInputError和io.ErrUnexpectedEOF,后者可能表示截断传输 - 若输入来自HTTP请求参数或JSON字段,注意URL编码可能已对
+和/做了转义,需先url.QueryUnescape再解码
流式编解码:避免内存拷贝用NewEncoder/NewDecoder
处理大文件或HTTP响应体时,把整个内容读进内存再编解码既慢又占资源。这时应使用base64.NewEncoder或base64.NewDecoder包装io.Writer/io.Reader。