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 values
结构体自引用
type Node struct {
// 自引用只能用指针,否则无法确定内存大小,指针大小是确定的
left *Node
right *Node
}
结构体接收器
不同于包的函数,方法需要新建实例才能使用
func (u User) ChangeName(newName string) {
u.Name = newName
}
指针接收器