正如提到的那样,规范允许您返回值(作为非指针)或指针。这只是一个您需要做出的决定。
什么时候应该返回指针?
通常情况下,如果您返回的值作为指针更加“有用”,那就应该返回指针。它什么时候更有用呢?
例如,如果它具有许多带指针接收器的方法。是的,您可以将返回值存储在变量中,因此它是可寻址的,并且仍然可以调用其具有指针接收器的方法。但是,如果立即返回指针,您可以“链接”方法调用。请参见此示例:
type My int
func (m *My) Str() string { return strconv.Itoa(int(*m)) }
func createMy(i int) My { return My(i) }
现在正在写作:
fmt.Println(createMy(12).Str())
会导致错误:cannot call pointer method on createMy(12)
但如果返回一个指针,则可以正常工作:
func createMy(i int) *My { return (*My)(&i) }
此外,如果您将返回值存储在不可寻址的数据结构中(例如map
),则无法通过索引映射的值来调用值的方法,因为映射的值是不可寻址的。
请参考以下示例:My.Str()
具有指针接收器。因此,如果您尝试执行此操作:
m := map[int]My{0: My(12)}
m[0].Str() // Error!
由于"无法获取m[0]
的地址",所以您不能这样做。但是下面的方法可以实现:
m := map[int]*My{}
my := My(12)
m[0] = &my // Store a pointer in the map
m[0].Str() // You can call it, no need to take the address of m[0]
// as it is already a pointer
另一个指针有用的例子是,如果它是一个“大”的结构体,会被频繁地传递。 http.Request
是一个闪亮的例子。这个结构体很大,通常会被传递给其他处理程序,并且它具有使用指针接收器的方法。
如果你返回一个指针,那通常意味着返回值最好存储并作为指针传递。
File*
,因此不可能直接返回File
。在之前的情况下,使用new(File)
来开始一个File*
。 - user2864740malloc()
函数是相同的。如果你不需要它,就不必使用它。 - slebetman