【发布时间】:2016-01-25 20:00:01
【问题描述】:
对不起,如果我的问题看起来很愚蠢。我的背景是 PHP、Ruby、Python、Lua 和类似的语言,对现实生活中的指针一无所知。
根据我在互联网上阅读的内容以及对我提出的问题 (When is a pointer idiomatic?) 的回答,我了解到:
- 复制大数据时应使用指针。无需获取整个对象层次结构,而是接收其地址并访问它。
- 如果结构上有函数可以修改它,则必须使用指针。
因此,指针似乎是一件很棒的事情:我应该始终将它们作为函数参数获取,因为它们非常轻量级,而且如果我最终不需要修改结构上的任何内容也没关系。
但是,直观地看那句话,我觉得这听起来很令人毛骨悚然,但我不知道为什么。
那么,作为一个正在设计结构及其相关函数或只是函数的人,我应该什么时候收到指针?我应该什么时候收到一个值,为什么?
换句话说,我的NewAuthor 方法应该什么时候返回&Author{ ... },什么时候应该返回Author{ ... }?我的函数什么时候应该获得指向作者的指针作为参数,什么时候应该只获得Author 类型的值(副本)?
【问题讨论】:
-
在 Go 中,如果我打算让我的类型的实例不可变,我只会选择指针上的值。在我看来,指针几乎总是更好,而不仅仅是在 Go 中。
-
我来自类似的背景(Python,它没有明确的指针)并且已经接受了@evanmcdonnal 给出的相同建议。如果您没有 explicitly 不可变类,则应通过指针传递。
-
另外,如果你的不可变值很大,仍然传递指针并且只在接口中提供getter。