栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Go的构造函数为什么要返回地址?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Go的构造函数为什么要返回地址?

如前所述,是的,规范允许您返回值(作为非指针)或指针。这只是您必须做出的决定。

什么时候返回指针?

通常,如果您返回的值作为指针“更有用”。什么时候更有用?

例如,如果它有 很多使用指针接收器的方法
。是的,您可以将返回值存储在变量中,这样它就可以寻址,并且仍然可以调用具有指针接收器的方法。但是,如果立即返回一个指针,则可以“链接”方法调用。请参阅以下示例:

type My intfunc (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 mapm[0].Str() // You can call it, no need to take the address of m[0]// as it is already a pointer

指针有用的另一个示例是,如果 它是一个“大”结构,它将被大量传递

http.Request
是一个光辉的例子。它很大,通常会大量传递给其他处理程序,并且具有带有指针接收器的方法。

如果返回一个指针,通常表明如果将其存储并作为指针传递,则返回的值更好。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/394628.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号