结构体

Go 语言也有结构体——由若干 字段 ( field )组成的集合。

/_src/tour/structs.go
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
package main

import "fmt"

type Vertex struct {
    X int
    Y int
}


func main() {
    fmt.Println(Vertex{1, 2})
}

例子定义了一个名为 Vertex 的结构体,用于表示一个顶点。 结构体包含两个字段,分别是 XY ,类型都是 int

字段

结构体字段可以通过点号 . 操作符访问。

/_src/tour/struct-fields.go
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
 package main

 import "fmt"

 type Vertex struct {
     X int
     Y int
 }


 func main() {
     v := Vertex{1, 2}
     fmt.Println(v.X)

     v.X = 4
     fmt.Println(v.X)
 }

结构体指针

结构体字段可以通过 指针 来访问。

假设我们有一个结构体指针 p ,访问字段 X 理论上可以这么写 (*p).X 。 然而,这看上去很累赘不是? 作为很人性化的语言, Go 允许直接写成 p.X 。 这两种写法没有什么实质性的区别,但是后者显然更为清晰。

/_src/tour/struct-pointers.go
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
package main

import "fmt"

type Vertex struct {
    X int
    Y int
}


func main() {
    v := Vertex{1, 2}
    p := &v
    p.X = 1e9
    fmt.Println(v)
}

字面量

结构体字面量( literal ),即通过列举字段值来表示一个新分配的结构体。

可以通过 字段名: 语法指定部分字段值,其他字段则默认为 零值 。 由于指定了字段名,字段列举顺序也就无关紧要了。

在结构体之前加上 & 操作符,则返回对应的结构体指针。

/_src/tour/struct-literals.go
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
package main

import "fmt"

type Vertex struct {
    X, Y int
}

var (
    v1 = Vertex{1, 2}   // has type Vertex
    v2 = Vertex{X: 1}   // Y:0 is implicit
    v3 = Vertex{}       // X:0 and Y:0
    p  = &Vertex{1, 2}  // has type *Vertex
)


func main() {
    fmt.Println(v1, p, v2, v3)
}

下一步

下一节 我们一起来看看 Go 语言 数组

订阅更新,获取更多学习资料,请关注我们的 微信公众号

../_images/wechat-mp-qrcode.png

小菜学编程

微信打赏