我正在学习 Go,我对何时使用指针有点困惑。具体来说,当返回一个struct
从函数中,什么时候适合返回结构体实例本身,什么时候适合返回指向结构体的指针?
示例代码:
type Car struct {
make string
model string
}
func Whatever() {
var car Car
car := Car{"honda", "civic"}
// ...
return car
}
在什么情况下我想要返回指针,以及我会在什么情况下返回指针not想要?有没有好的经验法则?
您需要记住两件事:性能和 API。
汽车是如何使用的?它是一个有状态的对象吗?它是一个大型结构吗?不幸的是,当我不知道汽车是什么时,就无法回答。说实话,最好的方法就是看看别人是怎么做的,然后效仿。最终,你会对这类事情有一种感觉。我现在将描述标准库中的三个示例,并解释为什么我认为他们使用了他们所做的事情。
hash/crc32
: The crc32.NewIEEE() http://golang.org/pkg/hash/crc32/#NewIEEE函数返回一个指针类型(实际上是一个接口,但底层类型是一个指针)。哈希函数的实例具有状态。当您将信息写入哈希时,它会汇总数据,因此当您调用Sum()
方法,它会给你该一个实例的状态。
time
: The time.Date http://golang.org/pkg/time/#Date函数返回一个Time
结构。为什么?一次就是一次。它没有状态。它就像一个整数,您可以在其中比较它们、对它们进行数学运算等。API 设计者决定对时间的修改不会更改当前时间,而是会创建一个新时间。作为图书馆的用户,如果我想要一个月后的时间,我会想要一个新的时间对象,而不是更改我当前拥有的时间对象。一次的长度也只有3个字。换句话说,它很小,并且使用指针不会提高性能。
math/big
: big.NewInt() http://golang.org/pkg/math/big/#NewInt是一个有趣的。我们几乎可以同意,当您修改big.Int
,您通常会想要一个新的。 Abig.Int
没有内部状态,那为什么它是一个指针呢?答案很简单:性能。程序员意识到大整型......大。每次进行数学运算时不断分配可能不切实际。因此,他们决定使用指针并允许程序员决定何时分配新空间。
我回答你的问题了吗?可能不会。这是一个设计决策,您需要根据具体情况来解决。当我设计自己的库时,我使用标准库作为指导。这实际上完全取决于判断以及您期望客户端代码如何使用您的类型。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)