了解 Go 构造函数中返回地址的用法:新建与直接返回
与提供显式构造函数的其他语言不同,Go 采用了“新”函数代替构造函数。但是,为什么 Go 的“New”函数中通常返回地址(&f),而不是直接返回 File 对象?
地址和直接返回之间的区别
Go 的语法允许返回值(非指针)或指针,将决定权留给开发人员。通常,当值作为 1 更有用时,会返回指针。如果返回值:
1,则尤其如此。具有带有指针接收器的多个方法:
返回指针允许直接在返回的对象上链接方法调用,即使这些方法采用指针接收器也是如此。这样就无需将返回值存储在变量中并手动调用方法。
2.存储在不可寻址的数据结构中:
某些数据结构(例如映射)不支持直接寻址值。返回指针可以规避此限制,允许对数据结构中存储的值进行方法调用。
3.是否是经常传递的大型结构体:
指针对于大量传递的大型结构体是有利的,因为它可以优化内存使用和性能。
示例比较:
考虑一个带有采用指针的方法的简单结构接收者:
type My int func (m *My) Str() string { return strconv.Itoa(int(*m)) } func createMy(i int) My { return My(i) } // Direct return func createMyPtr(i int) *My { return (*My)(&i) } // Address return
尝试使用直接返回值时:
fmt.Println(createMy(12).Str())
发生错误:“无法在 createMy(12) 上调用指针方法”。然而,随着地址返回:
fmt.Println(createMyPtr(12).Str())
方法调用成功,没有错误。
结论:
是否返回a的决定直接在 Go 的“New”函数中使用指针或值取决于返回对象的预期用途。在处理带有指针接收器的方法、不可寻址的数据结构或频繁传递的大型结构时,指针具有优势。
以上是为什么在 Go 的'新”函数中返回指针而不是值?的详细内容。更多信息请关注PHP中文网其他相关文章!