事情的起因是這樣的:
在做 siber 項(xiàng)目的時(shí)候,有接口使用 []byte 類(lèi)型數(shù)據(jù)接收文件流。
// proto 定義
bytes file_data = 1;
但是 siber 是統(tǒng)一使用 json 格式進(jìn)行的 request body 定義,不能直接傳輸。
一個(gè)通用的解決方案是將 []byte 轉(zhuǎn)化為 base64 進(jìn)行傳輸。我們選用這個(gè)包:
"encoding/base64"
這個(gè)包下面帶有不同的 base64 編碼格式:
- StdEncoding:常規(guī)編碼
- URLEncoding:URL safe 編碼
- RawStdEncoding:常規(guī)編碼,末尾不補(bǔ) =
- RawURLEncoding:URL safe 編碼,末尾不補(bǔ) =
跟常規(guī)編碼相比, URL safe替換掉字符串中的特殊字符,+ 和 /
以[]byte("Hello world. 你好,世界!") 為例:
base64.StdEncoding.EncodeToString(msg)
// SGVsbG8gd29ybGQuIOS9oOWlve+8jOS4lueVjO+8gQ==
base64.RawStdEncoding.EncodeToString(msg)
// SGVsbG8gd29ybGQuIOS9oOWlve+8jOS4lueVjO+8gQ
base64.URLEncoding.EncodeToString(msg)
// SGVsbG8gd29ybGQuIOS9oOWlve-8jOS4lueVjO-8gQ==
base64.RawURLEncoding.EncodeToString(msg)
// SGVsbG8gd29ybGQuIOS9oOWlve-8jOS4lueVjO-8gQ