golang学习随便记5

Posted sjg20010414

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang学习随便记5相关的知识,希望对你有一定的参考价值。

复合数据类型(构造类型)

JSON

golang 天生支持 JSON 和 html,意味着它天生为网络编程服务。

JSON使用的基本类型是数字(十进制或科学计数法)、布尔值(true或false)、字符串(Unicode码点序列,用\\为转义符,\\uhhh得到的是UTF-16字符)。

JSON用基本类型可以组合出构造类型:数组和对象。JSON的数组和golang数组和slice对应,JSON的对象和golang map和结构体对应。把golang的数组或结构体之类转成JSON的过程,称为Marshal(列集),而把JSON数据转换到golang数组或结构体变量,称为Unmarshal(反列集,解码列集)。因为golang结构体等用首字母大小写控制访问,而JSON字段名完全可能小写开头,而且,我们有时候并不想JSON字段名和结构体成员名一致,这时需要字段标签(field tag),它是编译期给编译器提示用的元信息。

package main

import (
	"encoding/json"
	"fmt"
	"log"
)

func main() {
	var movies = []Movie{
		{Title: "T1", Year: 1942, Color: false, Actor: []string{"AA", "BB"}},
		{Title: "T2", Year: 1967, Color: true, Actor: []string{"CC", "DD"}},
		{Title: "T3", Year: 1968, Color: true, Actor: []string{"EE", "FF"}},
	}
	data, err := json.MarshalIndent(movies, "", "    ")
	if err != nil {
		log.Fatalf("JSON marshaling failed: %s", err)
	}
	fmt.Printf("%s\\n", data)
	var titles []struct{ Title string }
	if err := json.Unmarshal(data, &titles); err != nil {
		log.Fatalf("JSON unmarshaling failed: %s", err)
	}
	fmt.Println(titles)
}

type Movie struct {
	Title string
	Year  int  `json:"released"`
	Color bool `json:"color,omitempty"`
	Actor []string
}

输出

[
    {
        "Title": "T1",
        "released": 1942,
        "Actor": [
            "AA",
            "BB"
        ]
    },
    {
        "Title": "T2",
        "released": 1967,
        "color": true,
        "Actor": [
            "CC",
            "DD"
        ]
    },
    {
        "Title": "T3",
        "released": 1968,
        "color": true,
        "Actor": [
            "EE",
            "FF"
        ]
    }
]
PS C:\\Users\\zime\\go\\src\\ch1\\hello> go run .
[
    {
        "Title": "T1",
        "released": 1942,
        "Actor": [
            "AA",
            "BB"
        ]
    },
    {
        "Title": "T2",
        "released": 1967,
        "color": true,
        "Actor": [
            "CC",
            "DD"
        ]
    },
    {
        "Title": "T3",
        "released": 1968,
        "color": true,
        "Actor": [
            "EE",
            "FF"
        ]
    }
]
[{T1} {T2} {T3}]

字段标签(总是反引号包围) json:"color,omitempty" ,表示对应JSON字段为color,并且该字段为零值(对bool型false就是零值)时从JSON忽略它,所以,对于Color为false的条目,JSON中没有color项。

其它细节只是查阅文档的问题。

文本和HTML模板

golang的模板确实比较糟糕,可读性比较差,这也是王垠大神吐槽的一个点。这里略过。

以上是关于golang学习随便记5的主要内容,如果未能解决你的问题,请参考以下文章

golang学习随便记14

golang学习随便记14

golang学习随便记3

golang学习随便记9

golang学习随便记12

golang学习随便记7