go-结构体

136 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第11天,点击查看活动详情

指针

Go拥有指针。指针保存了值的内存地址。

类型*T是指向T类型值的指针。其零值为nil

var p *int

&操作符会生成一个指向操作数的指针。

i := 42
p = &i

*操作符表示指针指向的底层值。

fmt.Println(*p) // 通过指针 p 读取 i
*p = 21         // 通过指针 p 设置 i
package main

import "fmt"

func main() {
   i, j := 42, 2701

   p := &i         //指向i
   fmt.Println(*p) //通过指针读取i的值
   *p = 21         //通过指针设置i的值
   fmt.Println(i)

   p = &j
   *p = *p / 37   //通过指针对j进行c除法运算
   fmt.Println(j) //查看j的值
}

结构体

一个结构体(struct)就是一组字段(filed)。

package main

import "fmt"

type Vertex3 struct {
   X int
   Y int
}

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

结构体字段

结构体字段使用点号来访问。

package main

import "fmt"

type Vertex4 struct {
   X int
   Y int
}

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

注意v.X = 4本质上是(*(&v)).X = 4相当于go的语法糖。

结构体指针

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

如果我们有一个指向结构体的指针 p,那么可以通过 (*p).X 来访问其字段 X。不过这么写太啰嗦了,所以语言也允许我们使用隐式间接引用,直接写 p.X 就可以。

package main

import "fmt"

type Vertex5 struct {
   X int
   Y int
}

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

p.X = 1e9本质上是(*p).X = 1e9相当于go的语法糖。

结构体文法

结构体文法通过直接列出字段的值来分配一个结构体。

使用 Name: 语法可以仅列出部分字段。(字段名的顺序无关。)

特殊的前缀 & 返回一个指向结构体的指针。

package main

import "fmt"

type Vertex6 struct {
   X, Y int
}

var (
   v1 = Vertex6{1, 2}  // 创建一个Vertex 类型的结构体
   v2 = Vertex6{X: 1}  // Y被隐式地赋值为0
   v3 = Vertex6{}      // X、Y被隐式地赋值为0
   p  = &Vertex6{1, 2} // 创建一个*Vertex6结构体(指针)
)

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