什么时候返回结构体指针是个好主意?

2024-05-23

我正在学习 Go,我对何时使用指针有点困惑。具体来说,当返回一个struct从函数中,什么时候适合返回结构体实例本身,什么时候适合返回指向结构体的指针?

示例代码:

type Car struct {
  make string
  model string
}

func Whatever() {
  var car Car

  car := Car{"honda", "civic"}

  // ...

  return car
}

在什么情况下我想要返回指针,以及我会在什么情况下返回指针not想要?有没有好的经验法则?


您需要记住两件事:性能和 API。

汽车是如何使用的?它是一个有状态的对象吗?它是一个大型结构吗?不幸的是,当我不知道汽车是什么时,就无法回答。说实话,最好的方法就是看看别人是怎么做的,然后效仿。最终,你会对这类事情有一种感觉。我现在将描述标准库中的三个示例,并解释为什么我认为他们使用了他们所做的事情。

  1. hash/crc32: The crc32.NewIEEE() http://golang.org/pkg/hash/crc32/#NewIEEE函数返回一个指针类型(实际上是一个接口,但底层类型是一个指针)。哈希函数的实例具有状态。当您将信息写入哈希时,它会汇总数据,因此当您调用Sum()方法,它会给你该一个实例的状态。

  2. time: The time.Date http://golang.org/pkg/time/#Date函数返回一个Time结构。为什么?一次就是一次。它没有状态。它就像一个整数,您可以在其中比较它们、对它们进行数学运算等。API 设计者决定对时间的修改不会更改当前时间,而是会创建一个新时间。作为图书馆的用户,如果我想要一个月后的时间,我会想要一个新的时间对象,而不是更改我当前拥有的时间对象。一次的长度也只有3个字。换句话说,它很小,并且使用指针不会提高性能。

  3. math/big: big.NewInt() http://golang.org/pkg/math/big/#NewInt是一个有趣的。我们几乎可以同意,当您修改big.Int,您通常会想要一个新的。 Abig.Int没有内部状态,那为什么它是一个指针呢?答案很简单:性能。程序员意识到大整型......大。每次进行数学运算时不断分配可能不切实际。因此,他们决定使用指针并允许程序员决定何时分配新空间。

我回答你的问题了吗?可能不会。这是一个设计决策,您需要根据具体情况来解决。当我设计自己的库时,我使用标准库作为指导。这实际上完全取决于判断以及您期望客户端代码如何使用您的类型。

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

什么时候返回结构体指针是个好主意? 的相关文章

  • C# 数组如何存储在内存中

    我想我的主要问题是 只要我不重新初始化 新字节 作为参数传递的数组 这总是有效吗 static unsafe decimal GetDecimal byte ba decimal decimal PTR fixed byte byte PT
  • Bash脚本无法执行Go命令

    我正在尝试编写一个 bash 脚本来自动在不同的目录中运行 go get install 相关部分在这里 cd web go get cd web go install cd services go get cd services go i
  • 指向函数中结构体数组的指针

    我的指针有问题 我想用一个函数读取一个二进制文件 然后在 main c 文件中使用读取的数据 问题是我必须传递一个指向结构数组的指针才能使用 main 中的数据 代码是 define TMOLDEO 8 define TAM 41 stru
  • 数据库连接最佳实践

    我有一个使用 net http 的应用程序 我使用 http 注册了一些处理程序 这些处理程序需要从数据库中获取一些内容 然后才能继续编写响应并完成请求 我的问题是连接到该数据库的最佳实践是什么 我希望它能够以每分钟 1 个请求或每秒 10
  • 无法理解 5.6.1。注意事项:捕获迭代变量

    我正在学习 Go 但无法理解 var rmdirs func for dir range tempDirs os MkdirAll dir 0755 rmdirs append rmdirs func os RemoveAll dir NO
  • 当变量更新时动态刷新模板的一部分golang

    在Golang中 当变量更新时可以刷新模板的一部分吗 例如 我们可以在 Angular js 中找到这一点 基本上在我的代码中 我通过 ajax 中的邮政编码查找地址 它显示我找到的该邮政编码的用户列表 Here is a sample o
  • 编译器错误:从 int* 到 unsigned int* 的无效转换 [-fpermissive]

    我今天遇到了最奇怪的问题 我正在网上使用一个示例 但令我惊讶的是 它不起作用 他们几乎从不这样做 我自己着手修复它 但我似乎陷入了这个错误 Error Invalid Conversion from int to unsigned int
  • 指向数组的指针如何工作?

    int s 4 2 1234 56 1212 33 1434 80 1312 78 int p 1 p s 0 printf d n p 0 1234 printf d n s 0 0 1234 printf u n p 1256433 a
  • Go API 在 html 中显示 swagger api 规范 (json) (Swagger UI)

    我有一个服务于特定端口的应用程序 gorilla mux 我也有一个 json 文件形式的 swagger API 规范 是否有任何 go API 可以像 spring boot 一样从 JSON 文件生成 swagger UI 定义 我正
  • 简单、高效的弱指针,当目标内存被释放时设置为 NULL

    有没有简单 高效的弱 保护指针 我需要多个指向同一对象的指针 当删除该对象时 这些指针都会自动设置为 NULL 有一个 主 指针始终用于删除对象 但可以有多个其他指针引用同一对象 以下是一些不太符合我的需求的解决方案 QPointer ht
  • 字符数组的文字字符串初始值设定项

    对于数组衰减为指针的情况 规则如下 出现在表达式中的 array of T 类型的左值 参见问题 2 5 衰减 有三个例外 为指向其第一个元素的指针 结果指针的类型是指向 T 的指针 例外情况是数组是 sizeof 或 运算符的操作数 或者
  • 如何在 Go 中表示可选字符串?

    我希望建模一个可以有两种可能形式的值 不存在或字符串 执行此操作的自然方法是Maybe String or Optional
  • GO并发编程测试

    我试图确保我的并发程序不存在以下情况 僵局 livelock 饥饿 我找到了以下工具http blog golang org race detector http blog golang org race detector 我尝试编译并运行
  • 通过引用传递参数到指针问题

    每次我尝试编译代码时都会收到错误 cannot convert parameter 1 from int to int 测试代码如下所示 void set int val val 10 int main int myVal int pMyV
  • 将结构化数据类型从 Fortran 传递到 C++ [重复]

    这个问题在这里已经有答案了 我在 Fortran 中有一个结构化类型 其中包含大量数据 包括指针 real 8 指针数据类型 我正在为某些 Fortran 例程开发 C API 我需要在对 Fortran 例程的调用之间保留该结构的内容 我
  • 无法通过键获取 Gorilla 会话值

    我无法通过这种方式从会话中获取价值 它是nil session initSession r valWithOutType session Values key 完整代码 package main import fmt github com
  • 如何在golang模板上打印JSON?

    我需要在客户端有一个对象 所以我使用 json marshal 将其转换为 JSON 并将其打印到模板中 该对象被打印为转义 JSON 字符串 我期待它是var arr o1 o2 但它是var arr o1 o2 我知道我可以在客户端进行
  • 如何在 Golang 中将 []byte XML 转换为 JSON 输出

    有没有办法在 Golang 中将 XML byte 转换为 JSON 输出 我有以下功能body is byte但我想在一些操作之后将此 XML 响应转换为 JSON 我试过了Unmarshal in xml打包没有成功 POST func
  • 如何从非英语字符串解析go中的月份

    我想将以下字符串解析为 go 中的日期 This item will be released on March 9 2014 我跟着this https stackoverflow com questions 14106541 go par
  • 为什么我不能对普通变量进行多态?

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

随机推荐