★encoding | encoding包定義了供其它包使用的可以將數(shù)據(jù)在字節(jié)水平和文本表示之間轉(zhuǎn)換的接口.
編碼在之前一直是一個(gè)重大問(wèn)題蘸鲸,更可讀的噪伊?效率更高的榨婆?輕量級(jí)的磁携?重量級(jí)的?多種編碼類(lèi)型共存良风。
encoding
encoding定義了四個(gè)接口(并沒(méi)有多少對(duì)象去實(shí)現(xiàn)谊迄,甚至目錄下的子包):
// 實(shí)現(xiàn)了本接口的對(duì)象可以把自身編碼為二進(jìn)制,并作為返回值返回
type BinaryMarshaler interface {
MarshalBinary() (data []byte, err error)
}
// 實(shí)現(xiàn)了本接口的對(duì)象可以把二進(jìn)制編碼為自身拖吼,接受者應(yīng)該為指針鳞上,傳參應(yīng)該是TextMarshaler生成的二進(jìn)制
type BinaryUnmarshaler interface {
UnmarshalBinary(data []byte) error
}
// 實(shí)現(xiàn)了本接口的對(duì)象可以把自身編碼為文本,并作為返回值返回
type TextMarshaler interface {
MarshalText() (text []byte, err error)
}
// 實(shí)現(xiàn)了本接口的對(duì)象可以把文本編碼為自身吊档,接受者應(yīng)該為指針篙议,傳參應(yīng)該是TextMarshaler生成的文本
type TextUnmarshaler interface {
UnmarshalText(text []byte) error
}
encoding中有多個(gè)子包,實(shí)現(xiàn)了多種編碼格式:
- ascii85:用于btoa工具怠硼、Adobe的PostScript 腳本和PDF文檔格式鬼贱,資料很少
- asn1:證書(shū)組成結(jié)構(gòu)標(biāo)準(zhǔn)用ASN.1來(lái)進(jìn)行描述,如X.509
- base32:使用了可打印的字符中的32個(gè)(A~Z和2~7)對(duì)任意字節(jié)數(shù)據(jù)進(jìn)行編碼
- base64:使用了可打印的字符中的32個(gè)(A~Z,a~z,0~9,"+","/")對(duì)任意字節(jié)數(shù)據(jù)進(jìn)行編碼
- binary:實(shí)現(xiàn)了了VarInt編碼香璃,低位在前这难,單byte最高位為1代表有后續(xù)字節(jié),使用zig-zag編碼映射有符號(hào)數(shù)(在最低位:正數(shù)x.VarInt=2x+0葡秒,負(fù)數(shù)x.VarInt=2x+1)
- csv:逗號(hào)分隔值Comma-Separated Values編碼姻乓,記錄之間用'\n'分割
- gob:rpc的編碼格式
- hex:編碼為16進(jìn)制小寫(xiě)字符"0x3e",效率低下
- json:json編碼
- xml:xml編碼
- pem:常見(jiàn)在證書(shū)眯牧、密鑰格式蹋岩,包含Type(
-----BEGIN TYPE-----
)和內(nèi)容(base64格式)與可選的Headers(asd: dsa),如:
pem.Block{
Type: "pem",
Headers: m,
Bytes: []byte("山東核炸朝鮮"),
}
結(jié)果:
-----BEGIN pem-----
asd: das
5bGx5Lic5qC454K45pyd6bKc
-----END pem-----