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

2024-01-03

我知道 Go 没有任何构造函数和New func被用在它的地方,但根据这个例子 http://golang.org/doc/effective_go.html#composite_literals.

func NewFile(fd int, name string) *File {
  if fd < 0 {
    return nil
  }
  f := File{fd, name, nil, 0}
  return &f
}

他们总会回来&f。为什么只是简单地返回File还不够吗?

Update

我尝试过返回一个简单结构的创建对象,效果很好。所以,我想知道返回地址是否是构造函数之类的标准方式。

Thanks.


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

什么时候返回指针?

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

例如,如果有许多带有指针接收器的方法。是的,您可以将返回值存储在变量中,因此它将是可寻址的,并且您仍然可以调用具有指针接收器的方法。但如果立即返回指针,则可以“链接”方法调用。看这个例子:

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 https://golang.org/pkg/net/http/#Request是一个光辉的例子。它很大,通常会被大量传递给其他处理程序,并且它具有带有指针接收器的方法。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么Go的构造函数要返回地址? 的相关文章

  • 安全移动 C++ 对象

    我听到过一些警告 不要通过以下方式将对象运送到另一个内存位置memcpy 但不知道具体原因 除非它包含的成员做了依赖于内存位置的棘手事情 否则这应该是完全安全的 或者不是 编辑 预期的用例是像这样的数据结构vector 它存储对象 不是po
  • Go 中的 WebP 编码器/解码器

    是否有一个完整的 WebP 编码器和解码器与当前每周 或可分叉 兼容 它的速度与标准 png 相当吗 这个人在 GitHub 上有一个包 其中包含 WebP 的编码器和解码器 https github com chai2010 webp h
  • Golang 按位运算以及一般字节操作

    我有一些 C 代码 可以对字节执行一些按位运算 我正在尝试在 golang 中做同样的事情 但遇到了困难 C 中的示例 byte a c byte data int j c data j c byte c j c a c 0xFF c 0x
  • 将结构化数据类型从 Fortran 传递到 C++ [重复]

    这个问题在这里已经有答案了 我在 Fortran 中有一个结构化类型 其中包含大量数据 包括指针 real 8 指针数据类型 我正在为某些 Fortran 例程开发 C API 我需要在对 Fortran 例程的调用之间保留该结构的内容 我
  • 我们如何在 Golang 中组合多个错误字符串?

    我是 golang 新手 我的应用程序需要在循环中返回多个错误 稍后需要组合并作为单个错误字符串返回 我无法使用字符串函数来组合错误消息 在返回之前可以使用什么方法将这些错误合并为一个错误 package main import fmt s
  • Golang 基础知识 struct 和 new() 关键字

    我正在学习 golang 当我阅读描述结构的章节时 我遇到了初始化结构的不同方法 p1 passport var p2 passport p3 passport Photo make byte 0 0 Name Scott Surname
  • 在 IntelliJ IDEA 中运行。多个文件和错误未定义:数据

    我想使用 IntelliJ IDE 社区版编写代码GO Go语言 我安装了正确的插件 并安装了构建应用程序所需的所有工具 我的应用程序包含以下两个文件 每个都在目录中 事件服务器 Main go Data go 如果我想使用 Run Ctl
  • 指向基类的成员指针

    全部 我不明白为什么下面的代码需要强制转换才能工作 有人可以解释一下吗 class Base class Derived public Base class Class public Derived member Derived obj B
  • Golang中如何删除字符串的最后一个字符?

    我想删除字符串的最后一个字符 但在此之前我想检查最后一个字符是否是 如何才能做到这一点 以下是删除尾随加号的几种方法 package main import fmt strings func TrimSuffix s suffix stri
  • 如何为优先级队列预分配内存? [复制]

    这个问题在这里已经有答案了 目前我正在尝试实施这个解决方案 https stackoverflow com a 29236236 8882282 https stackoverflow com a 29236236 8882282当我使用
  • 为什么我不能对普通变量进行多态?

    我是一名Java程序员 最近开始学习C 我对某事感到困惑 据我了解 在 C 中 要实现多态行为 您必须使用指针或引用 例如 考虑一个类Shape与实施的方法getArea 它有几个子类 每个子类都以不同的方式重写 getArea 然后考虑以
  • 如何从尖点库矩阵格式获取原始指针

    我需要从尖点库矩阵格式获取原始指针 例如 cusp coo matrix
  • 使用覆盖率信息测试 Go 中的 os.Exit 场景 (coveralls.io/Goveralls)

    这个问题 如何在 Go 中测试 os exit 场景 https stackoverflow com questions 26225513 how to test os exit scenarios in go 以及其中得票最高的答案 列出
  • 编写每个处理程序中间件

    我希望从处理程序中提取一些重复的逻辑 并将其放入一些每个处理程序的中间件中 特别是 CSRF 检查 检查现有会话值 即身份验证或预览页面 等 我读了关于此的几篇文章 http justinas org writing http middle
  • golang mongodb (mgo) 没有插入文档

    我在使用 mgo 在 mongodb 中保存 golang 结构时遇到问题 type AN Track Log struct Id bson ObjectId bson id omitempty user session id str st
  • 如何在 Go 中从 stdin 解析无限 json 数组?

    我正在尝试编写一个 i3status 的小替代品 一个与 i3bar 兼容的小程序进行通信this http i3wm org docs i3bar protocol html协议 他们通过标准输入和标准输出交换消息 两个方向的流都是一个无
  • 在 Go/ 中创建/更新 google 驱动器权限/ [使用 api 创建电子表格但无法访问它]

    我正在尝试使用 google Drive api 和以下代码创建电子表格 但我无法访问它 update 该文件似乎不在我在这里指定的驱动器中 有人知道为什么会发生这种情况吗 update 在字段中添加了父母 但有 404 错误 说找不到文件
  • 地址常量表达式

    我在阅读 C 编程语言第四版 一书时正在深入研究地址常量表达式 它有一个简短的段落描述了地址常量表达式 静态分配对象的地址 例如全局对象 变量 是常数 然而 它的值是由链接器分配的 而不是编译器 因此编译器无法知道 这样的地址常量 这限制了
  • if(pointerVar) 与 if(pointerVar!=NULL) 相同吗?

    简单的问题 Is if pointerVar 与if pointerVar NULL 也是if pointerVar 与if pointerVar NULL 给我你在技术上最正确 迂腐的答案 这两种说法看起来和操作起来都是一样的 前者有什么
  • 如何在遗留代码中摆脱对 RogueWave 的使用?

    我的任务是从遗留的 C 代码库中删除 RogueWave 组件 为此 我尝试围绕现有组件构建包装器 确保代码功能相同 然后选择不同的库 例如 boost 来粘贴到包装器中 我遇到的问题之一是大部分代码库都需要指向 RogueWave 对象的

随机推荐

  • 如何正确配置 Julia 便携式或独立式

    如何正确配置Julia 便携式或独立式 https julialang s3 julialang org bin winnt x64 1 5 julia 1 5 0 win64 zip 对于外部存储 USB 驱动器发生的一切 添加 更新软件
  • libpcap 还是 PF_PACKET?

    我知道这个问题已经讨论过很多次了 我应该使用 libpcap 还是 PF PACKET 数据链路套接字 来捕获数据包 根据我的研究 几乎所有地方都建议使用 libpcap 而不是 PF PACKET 主要是因为它的可移植性 然而 对于我当前
  • 替换 Flutter 中的片段等小部件

    我是颤振新手 我有一个带有 2 个子小部件 Android 中的 2 个片段 的应用程序 当我单击 WidgetA 中的下一个按钮时 我想将该小部件替换 或推送 到 WidgetChildA 中 就像 Android 中的推送 或替换 片段
  • 什么开源消息队列软件可以提供严格排序的耐用性?

    我们需要的是实际上作为队列工作的 RabbitMQ并且不这样做 http www rabbitmq com faq html message ordering 消息应该保留在队列的头部 直到客户端明确地将它们出队 这似乎是一个非常简单的场景
  • Asp Net Core Web 推送通知

    主要目标是向站点添加发送 Web 通知的功能 以弹出系统通知 以使用 Html5 Push API 和服务工作人员提醒用户 不使用 SignalR 它只能在打开站点时运行客户端脚本 如前所述 还应该能够在网站关闭时发送通知here http
  • CMake - 在 Linux 中编译,在 Windows 中执行

    我有一个具有 Linux 依赖项的大型代码库 我想使用 CMake 将我的代码编译成可以在 Windows 上运行的可执行文件 即我希望 CMake 生成一个 exe 文件或类似性质的文件 我尝试过使用CMake网站上提供的解决方案 htt
  • Android Studio 本身不显示“数据库检查器”

    我使用的是4 2版本 这是Android Studio的最新版本 正如文档中所述 我在 视图 gt 工具窗口 中搜索了数据库检查器 但它没有出现在那里 我如何找到数据库检查器 任何帮助将不胜感激 Thanks in advance 我刚刚解
  • 为什么 doctests 在使用 Sphinx 的 `make doctest` 运行时会引发 NameError?

    我有一个简单的带有 doctest 的函数 http git io Tq2fTw 当与 Sphinx 一起运行时make doctest 给我以下错误 File scheemey rst line in default Failed exa
  • CodeIgniter头像上传

    这是新的 HTML
  • 将参数作为 std::string 或 const std::string& 传递? [复制]

    这个问题在这里已经有答案了 可能的重复 在 C 中 按值传递还是按常量引用传递更好 https stackoverflow com questions 270408 is it better in c to pass by value or
  • 在这种情况下我可以忽略 C4251 警告吗?

    我明白为什么在编译代码时出现 C4251 警告 如中所述here http msdn microsoft com en us library esew7y1w aspx 我的问题是 如果可访问的导出类成员来自 STL 我们可以忽略 C425
  • 在所有网页上保留我的页眉和页脚?

    我已经完成了网站主页的设计 现在已经开始处理其他一些页面 我希望页眉和页脚在每个页面上显示相同 我已经尝试过这种基本方法来链接构成第二个 HTML 文件中的页眉 页脚的相同样式表 已在主页中使用 我现在明白这是行不通的 服务器端脚本语言是我
  • 向后台脚本发送消息

    我正在尝试实现一个屏幕共享 Web 应用程序 该应用程序将使用desktopCapture Chrome API 在网页上显示用户屏幕 我已经创建了 chrome 扩展 并在后台运行了一个事件侦听器 我的问题是 当我尝试从网页向扩展程序发送
  • 为什么布尔字段在 Hive 中不起作用?

    我的配置单元表中有一个数据类型为布尔值的列 当我尝试从 csv 导入数据时 它存储为 NULL 这是我的示例表 CREATE tABLE if not exists Engineanalysis EngineModel String Eng
  • 绑定到嵌套属性仅显示列表中的第一项

    我正在尝试将 NET 4 5 中的 C Winforms 中的 ListBox 控件绑定到具有我希望用于 DisplayMember 的嵌套属性的对象列表 它有点有效 除了当我将 DisplayMember 设置为嵌套属性时 列表框仅显示一
  • 如何将 TForm 作为参数传递给 DLL?

    我想制作使用 tform 作为参数的 dll 简单的计划是如果将该表单传递给 dll 则 dll 文件返回包含组件名称的数组 可以将 tform 作为参数传递吗 您的进程中很可能有两个 VCL 实例 一个用于主机 exe 另一个用于 DLL
  • 插入元素后如何让 jquery 将行为附加到元素

    我有一个通过 ajax 提交的表单 并返回一个更新的 html 块 其中包含我想通过 jquery 提交的更新表单 我遇到的问题是 第一次单击 提交 时 事件被 jquery 捕获并且效果很好 当我对表单进行另一次更改而不刷新时 jquer
  • 有没有办法对所有按钮 touchUpInside 方法断点?

    有时 当您的项目包含非常不受托管的代码时 就会发生这种情况 因此您无法弄清楚如何解决一个简单的问题 在大多数情况下 调试器可以帮助我们到达根源 我只是想知道 xcode 调试器有多强大 当我使用像 OllyDbg 这样的 asm 调试器时
  • SubSonic 3.0 中的 SQL 视图

    有什么方法可以访问 SubSonic 3 0 中的 SQL 视图吗 代码生成似乎完全跳过视图 将视图包含在您的项目中 只需打开 SQLServer ttinclude 查找加载表的查询 搜索形式 const string TABLE SQL
  • 为什么Go的构造函数要返回地址?

    我知道 Go 没有任何构造函数和New func被用在它的地方 但根据这个例子 http golang org doc effective go html composite literals func NewFile fd int nam