编码解码
encoding
包定义了共享接口,用于将数据在字节和文本表示形式间互相转换。
实现这些接口的包有 encoding/gob
、encoding/json
和 encoding/xml
等。
JSON 编码/解码
json
包实现了 RFC 7159 定义的 JSON 格式的编解码。
package main
import (
"encoding/json"
"fmt"
)
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
Email string `json:"email,omitempty"`
}
func main() {
// JSON 编码
person := Person{Name: "Lite Rank", Age: 30}
jsonData, err := json.Marshal(person)
if err != nil {
fmt.Println("JSON encoding error:", err)
return
}
fmt.Println("JSON Encoded:", string(jsonData))
// => JSON Encoded: {"name":"Lite Rank","age":30}
// JSON 解码
var decodedPerson Person
err = json.Unmarshal(jsonData, &decodedPerson)
if err != nil {
fmt.Println("JSON decoding error:", err)
return
}
fmt.Println("JSON Decoded:", decodedPerson)
// => JSON Decoded: {Lite Rank 30 }
}
XML 编码/解码
xml
包实现了一个简单的 XML 1.0 解析器。
package main
import (
"encoding/xml"
"fmt"
)
type PersonXML struct {
XMLName xml.Name `xml:"person"`
Name string `xml:"name"`
Age int `xml:"age"`
Email string `xml:"email,omitempty"`
}
func main() {
// XML 编码
person := PersonXML{Name: "John Doe", Age: 30}
xmlData, err := xml.MarshalIndent(person, "", " ")
if err != nil {
fmt.Println("XML encoding error:", err)
return
}
fmt.Println("XML Encoded:")
fmt.Println(string(xmlData))
// => XML Encoded:
//<person>
// <name>John Doe</name>
// <age>30</age>
//</person>
// XML 解码
var decodedPerson PersonXML
err = xml.Unmarshal(xmlData, &decodedPerson)
if err != nil {
fmt.Println("XML decoding error:", err)
return
}
fmt.Println("XML Decoded:", decodedPerson)
// => XML Decoded: {{ person} John Doe 30 }
}
Base64 编码/解码
base64
包按照 RFC 4648 标准实现了 base64 编解码。
package main
import (
"encoding/base64"
"fmt"
)
func main() {
// Base64 编码
data := []byte("Hello, Base64 Encoding!")
encodedData := base64.StdEncoding.EncodeToString(data)
fmt.Println("Base64 Encoded:", encodedData)
// => Base64 Encoded: SGVsbG8sIEJhc2U2NCBFbmNvZGluZyE=
// Base64 解码
decodedData, err := base64.StdEncoding.DecodeString(encodedData)
if err != nil {
fmt.Println("Base64 decoding error:", err)
return
}
fmt.Println("Base64 Decoded:", string(decodedData))
// => Base64 Decoded: Hello, Base64 Encoding!
}
Gob 编码/解码
Go 中的 encoding/gob
包用于以二进制格式对数据结构进行编码和解码。
package main
import (
"bytes"
"encoding/gob"
"fmt"
"log"
)
type Person struct {
Name string
Age int
}
func main() {
// 编码
person := Person{Name: "Alice", Age: 25}
var buffer bytes.Buffer
encoder := gob.NewEncoder(&buffer)
err := encoder.Encode(person)
if err != nil {
log.Fatal("Encode error:", err)
}
encodedData := buffer.Bytes()
fmt.Println("Encoded Data:", encodedData)
// => Encoded Data: [37 255 129 3 1 1 6 80 101 114 115 111 110 1 255 130 0 1 2 1 4 78 97 109 101 1 12 0 1 3 65 103 101 1 4 0 0 0 12 255 130 1 5 65 108 105 99 101 1 50 0]
// 解码
var decodedPerson Person
decoder := gob.NewDecoder(bytes.NewReader(encodedData))
err = decoder.Decode(&decodedPerson)
if err != nil {
log.Fatal("Decode error:", err)
}
fmt.Println("Decoded Person:", decodedPerson)
// => Decoded Person: {Alice 25}
}
代码挑战
创建一个程序,从 JSON 文件读取配置数据并根据配置执行特定操作。
Loading...
> 此处输出代码运行结果