首页 >后端开发 >Golang >为什么在 Go 的'新”函数中返回指针而不是值?

为什么在 Go 的'新”函数中返回指针而不是值?

Susan Sarandon
Susan Sarandon原创
2024-12-24 02:30:11538浏览

Why Return a Pointer Instead of a Value in Go's

了解 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn