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的主要内容,如果未能解决你的问题,请参考以下文章