天天看点

【go语言 基础系列】结构体及JSON编码

【结构体】

首字面大写,可导出的

结构体的零值由其成员的零值组成

空结构体,没有任何成员  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为缩进,本例中的“@”