结构体

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

/_src/tour/structs.go

  1. package main
  2.  
  3. import "fmt"
  4.  
  5. type Vertex struct {
  6. X int
  7. Y int
  8. }
  9.  
  10.  
  11. func main() {
  12. fmt.Println(Vertex{1, 2})
  13. }

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

字段

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

/_src/tour/struct-fields.go

  1. package main
  2.  
  3. import "fmt"
  4.  
  5. type Vertex struct {
  6. X int
  7. Y int
  8. }
  9.  
  10.  
  11. func main() {
  12. v := Vertex{1, 2}
  13. fmt.Println(v.X)
  14.  
  15. v.X = 4
  16. fmt.Println(v.X)
  17. }

结构体指针

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

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

/_src/tour/struct-pointers.go

  1. package main
  2.  
  3. import "fmt"
  4.  
  5. type Vertex struct {
  6. X int
  7. Y int
  8. }
  9.  
  10.  
  11. func main() {
  12. v := Vertex{1, 2}
  13. p := &v
  14. p.X = 1e9
  15. fmt.Println(v)
  16. }

字面量

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

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

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

/_src/tour/struct-literals.go

  1. package main
  2.  
  3. import "fmt"
  4.  
  5. type Vertex struct {
  6. X, Y int
  7. }
  8.  
  9. var (
  10. v1 = Vertex{1, 2} // has type Vertex
  11. v2 = Vertex{X: 1} // Y:0 is implicit
  12. v3 = Vertex{} // X:0 and Y:0
  13. p = &Vertex{1, 2} // has type *Vertex
  14. )
  15.  
  16.  
  17. func main() {
  18. fmt.Println(v1, p, v2, v3)
  19. }

下一步

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

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

../_images/wechat-mp-qrcode.png小菜学编程

微信打赏