携手创作,共同成长!这是我参与「掘金日新计划 · 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)
}