Go语言中的结构体《二》

struct的注意点

结构体是用户单独定义的类型,不能和其他类型进行强制转换

1
2
3
4
5
6
7
8
9
10
11
12
13
14

type student struct {
value int
}

type stu student

func main() {
var a student = student{value: 30}
var b stu = stu{}
//注意:这段代码的编译无法通过
a = b
}

struct中没有构造函数,一般可以使用工厂模式来解决这个问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

type student struct {
value int
}

func CreateStudent(val int) *student {
return &student{
value: val,
}
}

func main() {
var a *student = CreateStudent(1)
fmt.Printf("a:%v\n", a)
}
------------
a:&{1}

注意:make只用来创建map、slice、channel new用来创建值类型

struct中的tag

在Go中,如果一个struct需要被序列化成json,则需要其标识符和内部字段的首字母大写,否则Go自带的encoding/json包无法对其访问
而首字母大写后,序列化出的json中每个字段的首字母也会大写,这时候就需要使用tag来标识

  • 未使用tag标识的代码如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    import (
    "encoding/json"
    "fmt"
    )

    type Student struct {
    Name string
    Age int
    Score int
    }

    func test() {
    var s *Student = &Student{
    Name: "张三",
    Age: 18,
    Score: 61,
    }
    b, err := json.Marshal(s)
    if err != nil {
    fmt.Println(err)
    }
    fmt.Printf("%s\n", string(b))
    }

    func main() {
    test()
    }
    ---------------
    {"Name":"张三","Age":18,"Score":61}

    使用tag对struct的字段进行标识:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    type Student struct {
    //tag使用的是``反引号进行标识
    Name string `json:"name"`
    Age int `json:"age"`
    Score int `json:"score"`
    }

    func test() {
    var s *Student = &Student{
    Name: "张三",
    Age: 18,
    Score: 61,
    }
    b, err := json.Marshal(s)
    if err != nil {
    fmt.Println(err)
    }
    fmt.Printf("%s\n", string(b))
    }

    func main() {
    test()
    }
    -----------------
    {"name":"张三","age":18,"score":61}

    注意!tag使用``反引号进行标识!

struct中的匿名字段

结构体中的字段可以没有名字,即匿名字段,匿名字段可以通过.类型的方式进行访问和赋值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
type Car struct {
Name string
}

type Train struct {
Car
Name string
Start time.Time
}

func test1() {
var t Train
t.Car.Name = "车"
t.Name = "火车"
t.Start = time.Now()
fmt.Printf("%v\n", t)
}

func main() {
test1()
}
-----------------
{{车} 火车 2019-07-09 07:19:08.2539989 +0800 CST m=+0.002012401}