Go 何时在变量中而不是在结构本身中存储指向结构的指针
我目前正在学习围棋,并且正在学习一个关于如何使用带条纹围棋的教程。有以下示例代码:Go 何时在变量中而不是在结构本身中存储指向结构的指针,go,Go,我目前正在学习围棋,并且正在学习一个关于如何使用带条纹围棋的教程。有以下示例代码: package main import ( "fmt" "github.com/stripe/stripe-go" "github.com/stripe-go/customer" ) func main() { sc := &client.API{} sc.Init("somekey") c, _
package main
import (
"fmt"
"github.com/stripe/stripe-go"
"github.com/stripe-go/customer"
)
func main() {
sc := &client.API{}
sc.Init("somekey")
c, _ := sc.Customers.Get("customerid", nil)
// ...
}
sc
存储指向结构的指针而不是结构本身的原因是什么?[补充您收到的评论]
虽然在本例中,对于小代码示例很难说,但在大多数情况下,您会看到通过指针传递非平凡类型以启用修改。作为反示例,考虑使用值为结构类型的变量的代码:
type S struct {
ID int
}
func (s S) UpdateID(i int) {
s.ID = i
}
func main() {
s := S{}
s.UpdateID(99)
fmt.Println(s.ID)
}
你认为这会印什么?它将打印0,因为具有值接收器的方法无法修改基础类型
在Go-read中有很多关于指针以及如何编写方法的信息。这是一个很好的参考:,而且
回到您的示例:典型的非平凡类型(例如代表某些服务的“客户机”)将使用指针,因为对此类类型的方法调用应该能够修改类型本身。就这个小而不完整的代码片段而言,
sc
是否是指针并不重要,其中的所有语句将产生相同的输出/行为。因此,在没有看到整个代码的情况下,我们只能推测原因是什么。而且,这样你就不会抱太大希望了,即使我们检查完整的示例,代码的其余部分也可能是基本的,也就是说,不做任何需要变量作为指针的事情,这将给出你问题的答案:“作者偏好”。>“作者偏好”。谢谢,我想这可能有一个明显的原因,我只是不知道,因为我不太熟悉这门语言。围棋似乎是一种对什么时候做什么有明确规则的语言。谢谢你的解释。以您的代码示例为例,如果我只是将func(s)UpdateID(I int)
修改为func(s*s)UpdateID(I int)
,那么变异就已经起作用了,而无需更改s
来存储指针。这是让我困惑的一部分。@Linus:这是一个神奇的开始,当你调用s.Method
并且Method
有一个指针接收器时,调用实际上被转换为(&s).Method
,所以当你“存储”值时,指针会被传递。不过,只存储指针更干净,这是公认的做法,尽管在许多情况下,存储值会起作用。非常感谢您澄清这一点@Eli Bendersky。