在Golang的标准库中,encoding/base64包提供了Base64编码和解码的完整实现,能够满足日常开发中各类Base64相关的处理需求,无论是字符串、字节数据还是文件内容,都可以通过该包快速完成编码和解码操作。

encoding/base64包基础说明
encoding/base64包提供了多种编码方式,最常用的有两种:标准编码和URL安全编码。标准编码使用A-Z、a-z、0-9、+、/共64个字符作为编码字符集,而URL安全编码将+替换为-,/替换为_,避免编码结果在URL传输中出现问题。
包中预定义了几个常用的编码实例:
- StdEncoding:标准Base64编码实例
- URLEncoding:URL安全的Base64编码实例
- RawStdEncoding:无填充的标准Base64编码实例
- RawURLEncoding:无填充的URL安全Base64编码实例
字符串的Base64编码解码
标准编码示例
对普通字符串进行Base64编码和解码是最基础的使用场景,下面是完整的实现代码:
package main
import (
"encoding/base64"
"fmt"
)
func main() {
// 原始字符串
originStr := "Golang Base64编码解码实践"
fmt.Println("原始字符串:", originStr)
// 标准Base64编码
stdEncoded := base64.StdEncoding.EncodeToString([]byte(originStr))
fmt.Println("标准编码结果:", stdEncoded)
// 标准Base64解码
stdDecodedBytes, err := base64.StdEncoding.DecodeString(stdEncoded)
if err != nil {
fmt.Println("解码失败:", err)
return
}
stdDecodedStr := string(stdDecodedBytes)
fmt.Println("标准解码结果:", stdDecodedStr)
}
URL安全编码示例
当编码结果需要用在URL中时,需要使用URL安全编码,避免特殊字符被转义:
package main
import (
"encoding/base64"
"fmt"
)
func main() {
originStr := "测试URL参数?name=张三&age=20"
fmt.Println("原始字符串:", originStr)
// URL安全Base64编码
urlEncoded := base64.URLEncoding.EncodeToString([]byte(originStr))
fmt.Println("URL安全编码结果:", urlEncoded)
// URL安全Base64解码
urlDecodedBytes, err := base64.URLEncoding.DecodeString(urlEncoded)
if err != nil {
fmt.Println("解码失败:", err)
return
}
urlDecodedStr := string(urlDecodedBytes)
fmt.Println("URL安全解码结果:", urlDecodedStr)
}
字节切片的编码解码
除了字符串,很多时候我们需要处理字节切片类型的原始数据,编码解码逻辑和字符串类似,只是不需要做额外的类型转换:
package main
import (
"encoding/base64"
"fmt"
)
func main() {
// 原始字节切片
originBytes := []byte{0x01, 0x02, 0x03, 0x04, 0x05}
fmt.Printf("原始字节切片: %vn", originBytes)
// 编码字节切片
encodedStr := base64.StdEncoding.EncodeToString(originBytes)
fmt.Println("编码结果:", encodedStr)
// 解码得到字节切片
decodedBytes, err := base64.StdEncoding.DecodeString(encodedStr)
if err != nil {
fmt.Println("解码失败:", err)
return
}
fmt.Printf("解码后字节切片: %vn", decodedBytes)
}
无填充编码的使用
标准Base64编码会在结果末尾添加=作为填充字符,如果不需要填充,可以使用RawStdEncoding或者RawURLEncoding:
package main
import (
"encoding/base64"
"fmt"
)
func main() {
originStr := "无填充编码测试"
fmt.Println("原始字符串:", originStr)
// 有填充标准编码
withPadding := base64.StdEncoding.EncodeToString([]byte(originStr))
fmt.Println("有填充编码结果:", withPadding)
// 无填充标准编码
withoutPadding := base64.RawStdEncoding.EncodeToString([]byte(originStr))
fmt.Println("无填充编码结果:", withoutPadding)
// 无填充解码
decodedBytes, err := base64.RawStdEncoding.DecodeString(withoutPadding)
if err != nil {
fmt.Println("无填充解码失败:", err)
return
}
fmt.Println("无填充解码结果:", string(decodedBytes))
}
编码方式对比
不同编码方式的适用场景和特点可以通过下表快速了解:
| 编码实例 | 字符集特点 | 是否有填充 | 适用场景 |
|---|---|---|---|
| StdEncoding | 使用+和/ | 是 | 普通文本、二进制数据的编码存储 |
| URLEncoding | 使用-和_ | 是 | URL参数、文件名等场景 |
| RawStdEncoding | 使用+和/ | 否 | 不需要填充的普通数据存储 |
| RawURLEncoding | 使用-和_ | 否 | 不需要填充的URL相关场景 |
注意事项
- 解码时需要处理错误,如果传入的编码字符串不符合Base64格式,解码会返回错误
- 编码和解码使用的编码实例必须匹配,比如用StdEncoding编码的内容不能用URLEncoding解码
- 处理大文件时,可以使用
NewEncoder和NewDecoder方法实现流式处理,避免一次性加载全部内容到内存
通过上述示例,你可以掌握Golang中encoding/base64包的核心用法,根据实际需求选择合适的编码方式即可完成各类Base64编码解码任务。
Golangencoding_base64Base64编码Base64解码修改时间:2026-07-03 18:39:34