指针还是值:何时在Go的参数和返回值中使用*和&?
大家好!我最近开始学习Go,一直有个问题困扰着我:什么时候应该通过指针传递参数给函数,什么时候应该通过值传递?返回值也是同样的问题。
我似乎明白指针可以避免数据复制,但Go中不是所有东西都是复制传递的吗?还是说不是这样?我写了一个小例子,创建了一个User结构体并尝试修改它:
```go
type User struct {
Name string
Age int
}
func updateUser(u User) {
u.Name = "New Name" // 不如预期工作
}
func updateUserPtr(u *User) {
u.Name = "New Name" // 正常工作
}
```
但让我困惑的是:Go中所有东西都是按值传递的,但slice和map的行为却像引用?还是说不是这样?我读到过,大的结构体最好通过指针传递以避免复制,而小的结构体则按值传递。但什么算“大”?10个字段?20个?还是说这不仅仅关乎大小?
另外,我不明白什么时候应该从函数返回指针,什么时候返回值。