## 對Go數據編碼和解碼
除了JSON,TOML和YAML之外,Go還具有許多其他編碼類型。這些類型主要用于在Go進程之間傳輸數據,例如協議和RPC,或者在某些字符格式受限制的情況下。
本節將探討編碼和解碼gob格式和base64。后續章節將探討GRPC等協議。
### 實踐
1. 創建gob.go:
```
package encoding
import (
"bytes"
"encoding/gob"
"fmt"
)
type pos struct {
X int
Y int
Object string
}
// GobExample展示了如何使用gob包
func GobExample() error {
buffer := bytes.Buffer{}
p := pos{
X: 10,
Y: 15,
Object: "wrench",
}
// 注意如果p是個接口我們需要先調用gob.Register
e := gob.NewEncoder(&buffer)
if err := e.Encode(&p); err != nil {
return err
}
// 這里是二進制的 所以打印出來的長度可能并不準確
fmt.Println("Gob Encoded valued length: ", len(buffer.Bytes()))
p2 := pos{}
d := gob.NewDecoder(&buffer)
if err := d.Decode(&p2); err != nil {
return err
}
fmt.Println("Gob Decode value: ", p2)
return nil
}
```
2. 創建base64.go:
```
package encoding
import (
"bytes"
"encoding/base64"
"fmt"
"io/ioutil"
)
// Base64Example 演示了如何使用 base64 包
func Base64Example() error {
// base64對于不支持以字節/字符串操作的二進制格式的情況很有用
// 使用輔助函數和URL編碼
value := base64.URLEncoding.EncodeToString([]byte("encoding some data!"))
fmt.Println("With EncodeToString and URLEncoding: ", value)
// 解碼
decoded, err := base64.URLEncoding.DecodeString(value)
if err != nil {
return err
}
fmt.Println("With DecodeToString and URLEncoding: ", string(decoded))
return nil
}
// Base64ExampleEncoder 與上面的函數類似 但并沒有使用URL編碼
func Base64ExampleEncoder() error {
buffer := bytes.Buffer{}
// 建立編碼器
encoder := base64.NewEncoder(base64.StdEncoding, &buffer)
// 確認關閉
if err := encoder.Close(); err != nil {
return err
}
if _, err := encoder.Write([]byte("encoding some other data")); err != nil {
return err
}
fmt.Println("Using encoder and StdEncoding: ", buffer.String())
decoder := base64.NewDecoder(base64.StdEncoding, &buffer)
results, err := ioutil.ReadAll(decoder)
if err != nil {
return err
}
fmt.Println("Using decoder and StdEncoding: ", string(results))
return nil
}
```
3. 建立main.go:
```
package main
import (
"github.com/agtorre/go-cookbook/chapter3/encoding"
)
func main() {
if err := encoding.Base64Example(); err != nil {
panic(err)
}
if err := encoding.Base64ExampleEncoder(); err != nil {
panic(err)
}
if err := encoding.GobExample(); err != nil {
panic(err)
}
}
```
4. 這會輸出:
```
With EncodeToString and URLEncoding:
ZW5jb2Rpbmcgc29tZSBkYXRhIQ==
With DecodeToString and URLEncoding: encoding some data!
Using encoder and StdEncoding: ZW5jb2Rpbmcgc29tZSBvdGhlciBkYXRh
Using decoder and StdEncoding: encoding some other data
Gob Encoded valued length: 57
Gob Decode value: {10 15 wrench}
```
### 說明
Gob編碼是一種使用Go數據類型構建的流格式。在連續發送和編碼時效率最高。對于單個項目,其他編碼格式(如JSON)可能更高效且易于移植。使用gob編碼使得編組大型復雜結構并在單獨的過程中重建它們變得簡單。雖然這里沒有顯示,但gob也可以使用自定義MarshalBinary和UnmarshalBinary方法對自定義類型或未導出類型進行操作。
Base64編碼對于通過GET請求中的URL進行通信或生成二進制數據的字符串表示編碼非常有用。大多數語言都支持這種格式,并在另一端解碼數據。因此,在不支持JSON格式的情況下,對JSON等內容進行Base64編碼是很常見的。
* * * *
學識淺薄,錯誤在所難免。歡迎在群中就本書提出修改意見,以饗后來者,長風拜謝。
Golang中國(211938256)
beego實戰(258969317)
Go實踐(386056972)
- 前言
- 第一章 I/O和文件系統
- 常見 I/O 接口
- 使用bytes和strings包
- 操作文件夾和文件
- 使用CSV格式化數據
- 操作臨時文件
- 使用 text/template和HTML/templates包
- 第二章 命令行工具
- 解析命令行flag標識
- 解析命令行參數
- 讀取和設置環境變量
- 操作TOML,YAML和JSON配置文件
- 操做Unix系統下的pipe管道
- 處理信號量
- ANSI命令行著色
- 第三章 數據類型轉換和解析
- 數據類型和接口轉換
- 使用math包和math/big包處理數字類型
- 貨幣轉換和float64注意事項
- 使用指針和SQL Null類型進行編碼和解碼
- 對Go數據編碼和解碼
- Go中的結構體標簽和反射
- 通過閉包實現集合操作
- 第四章 錯誤處理
- 錯誤接口
- 使用第三方errors包
- 使用log包記錄錯誤
- 結構化日志記錄
- 使用context包進行日志記錄
- 使用包級全局變量
- 處理恐慌
- 第五章 數據存儲
- 使用database/sql包操作MySQL
- 執行數據庫事務接口
- SQL的連接池速率限制和超時
- 操作Redis
- 操作MongoDB
- 創建存儲接口以實現數據可移植性
- 第六章 Web客戶端和APIs
- 使用http.Client
- 調用REST API
- 并發操作客戶端請求
- 使用OAuth2
- 實現OAuth2令牌存儲接口
- 封裝http請求客戶端
- 理解GRPC的使用
- 第七章 網絡服務
- 處理Web請求
- 使用閉包進行狀態處理
- 請求參數驗證
- 內容渲染
- 使用中間件
- 構建反向代理
- 將GRPC導出為JSON API
- 第八章 測試
- 使用標準庫進行模擬
- 使用Mockgen包
- 使用表驅動測試
- 使用第三方測試工具
- 模糊測試
- 行為驅動測試
- 第九章 并發和并行
- 第十章 分布式系統
- 第十一章 響應式編程和數據流
- 第十二章 無服務器編程
- 第十三章 性能改進