空指针异常

type User struct {
	Id int
	Name string
}
func GetUser() (user *User) { return }
func main() {
	user := GetUser()
	fmt.Println(user, user.Id)
}

⬆️ GetUser 返回了一个空指针,访问返回值字段时会引发 panic。避免此类问题,一是可以在返回值包含指针类型变量的函数或方法中,在函数体开头初始化返回值的指针类型变量;二是在调用结构体指针类型返回值的函数或方法时,在操作返回值的字段或方法时,先判定返回值是否为 nil(空指针)

func GetUser() (user *User) {
	user = new(User)
	return
}

Pointers vs. Values in parameters and return

Pointers vs. values in parameters and return values

结构体自引用

type Node struct {
	// 自引用只能用指针,否则无法确定内存大小,指针大小是确定的
	left *Node
	right *Node
}

结构体接收器

不同于包的函数,方法需要新建实例才能使用

func (u User) ChangeName(newName string) {
	u.Name = newName
}

指针接收器