【结构体】
首字面大写,可导出的
结构体的零值由其成员的零值组成
空结构体,没有任何成员 struct{}
【赋值】
方法1:通过字面量赋值
type Point struct{
x int
y int
}
p:=Point{1,2}
方法2:通过指定全部或者部分成员变量的名称和值来初始化结构体变量
p:=Point{x=1}
另外,大型的结构体 通过结构体指针的方式传递数据
pp:=&Point{1,2}
【结构体的比较】
如果结构体的所有成员都是可以比较的,那么该结构体就是可以比较的。如果字段顺序不同,则是不同的类型
package main
import (
"fmt"
)
type addr1 struct {
ip string
port int
}
type addr2 struct {
port int
ip string
}
func main() {
a1 := addr1{ip: "127.0.0.1", port: 8080}
a2 := addr2{ip: "127.0.0.1", port: 8080}
fmt.Println(a1.ip == a2.ip && a1.port == a2.port)
// fmt.Println(a1 == a2)
}
去掉注释后 会有如下错误:./a.go:21:17: invalid operation: a1 == a2 (mismatched types addr1 and addr2)
【JSON】
JSON最基本的类型是数字、布尔值及字符串。字符串使用双引号,使用反斜杠做为转移字符
只有可导出的字段才能转义为JSON字段,及GO中的struct成员变量首字面大写
【结构体编码JSON】
通过以下两个函数可实现
func Marshal(v interface{}) ([]byte, error) {}
func MarshalIndent(v interface{}, prefix, indent string) ([]byte, error){}
例子如下
package main
import (
"encoding/json"
"fmt"
"log"
)
type Movie struct {
Title string
Year int `json:"released"` //在json中通过released替换Year字段
Color bool `json:"color,omitempty"` //omitempty 成员的值是零值或者为空,则不输出到JSON中
Actors []string
}
func main() {
m := []Movie{
{Title: "aa", Year: 2000, Color: false,
Actors: []string{"HB", "IB"}},
{Title: "bb", Year: 2001, Color: true,
Actors: []string{"PN"}},
{Title: "cc", Year: 2002,
Actors: []string{"as", "sd", "sd"}}}
data, err := json.Marshal(m)
if err != nil {
log.Fatalf("JSON marshaling failed:%s\n", err)
}
fmt.Printf("%s\n", data)
fmt.Println("##")
data2, err := json.MarshalIndent(m, "%", "@")
if err != nil {
log.Fatalf("JSON marshaling fialed:%s\n", err)
}
fmt.Printf("%s\n", data2)
}
输出结果如下
[{"Title":"aa","released":2000,"Actors":["HB","IB"]},{"Title":"bb","released":2001,"color":true,"Actors":["PN"]},{"Title":"cc","released":2002,"Actors":["as","sd","sd"]}]
##
[
%@{
%@@"Title": "aa",
%@@"released": 2000,
%@@"Actors": [
%@@@"HB",
%@@@"IB"
%@@]
%@},
%@{
%@@"Title": "bb",
%@@"released": 2001,
%@@"color": true,
%@@"Actors": [
%@@@"PN"
%@@]
%@},
%@{
%@@"Title": "cc",
%@@"released": 2002,
%@@"Actors": [
%@@@"as",
%@@@"sd",
%@@@"sd"
%@@]
%@}
%]
MarshalIndent(v interface{}, prefix, indent string) 函数中,prefix 为前缀,本例中的“%”, indent为缩进,本例中的“@”