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。