08-指针、nil
发布于 2026-08-20
08-指针、nil
指针
1、指针的定义和使用
通过*结构体实现
go
package main
import "fmt"
type Person struct {
name string
age int
}
func main() {
_// 指针的定义_
_ _var p *Person
_// 指针使用_
_ _p = &Person{"John", 20}
fmt.Println(p, *p, &p) _// &{John 20} {John 20} 0x42e7d8c0a038_
}-
*结构体:代表指针类型,例如:var p *int -
*变量名:解引用(取指针指向的值),例如:fmt.Println(*p) -
&:代表取地址符合,取变量的地址,例如:p := &x
go
type Person struct {
name string
age int
}
func changeName(p *Person) {
p.name = "Changed Name"
}
func main() {
p := Person{
name: "tian",
}
changeName(&p)
fmt.Println(p.name) _// Changed Name_
}给属性赋值,可以使用指针取值,也可以直接使用变量.属性,下面的两种方式等价
go
// 指针类型,和var po *Person一样
po := &Person{"Bob", 20}
_// 使用方式1_
po.name = "Jack"
_// 使用方式2_
(*po).age = 252、指针的初始化
指针是需要初始化的

初始化在初始化的时候推荐使用new方法,如果不初始化,容易出现nil pointer(也就是访问属性不存在)
初始化的两个关键字:make、new
- make:用于初始化map、slice、channel(map也必须要初始化)
- new:用于初始化指针,可以传递基本数据类型和接口
3、指针的运算(不能运算)
go限制了指针的运算,在c语言中拿到指针的地址之后,可以进行+1,到下一个地址,但是在go语言中是不行的,不能参加运算。
如果非要运算,在go的unsafe包中。
unsafe 是 Go 标准库中唯一可以绕过 Go 类型安全的包,它允许你直接操作内存地址。一般来说,99% 的 Go 业务代码都不需要使用 unsafe,只有以下场景会用到:
-
高性能框架(Gin、fasthttp、sonic)
-
runtime 底层
-
与 C 交互(CGO)
-
零拷贝(Zero Copy)
-
序列化框架
4、通过指针交换变量的值
nil
在go语言中,数据类型是有零值的概念的,不同类型的数据零值不一样
struct默认值不是nil,默认值是具体字段的默认值,解释:零值为:name为string,所以name为"",age为0,f为nil。而不是看整体的结构体类型
由于结构体的这个特性,可以直接使用等于来判断两个结构体是否相等
所以之前在判断是否有错误的时候,采用error == nil,因为error本质是interface,interface默认值是nil。
在判断某些类型是否为空,例如slice未初始化的时候是nil,是因为sllice的默认值是nil,才可以这样进行判断,并不是所有类型都可以
- nil slice和empty slice的区别:当使用make创建的,即使长度为0,也不等于nil
map也是如此