» Go语言快速入门 » 2. 进阶篇 » 2.2 编码解码

编码解码

encoding 包定义了共享接口,用于将数据在字节和文本表示形式间互相转换。 实现这些接口的包有 encoding/gobencoding/jsonencoding/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...
> 此处输出代码运行结果
上页
下页