我是围棋语言的新手,在C/C++方面的背景很低,所以我很自然地在思考什么时候使用指针,什么时候不使用指针.虽然这个问题可能被认为是开放式的,但我想知道关于何时返回 struct 和何时返回指针(以及何时等效地接受 struct /指针作为参数)的一些指导原则.

据我猜测,以下说法是正确的:

  1. struct 按值传递给函数.也就是说,在将 struct 传递到函数中时,会制作该 struct 的副本.
  2. 如果我想通过引用传递 struct ,那么我会在函数定义中使用指针参数,并在调用函数时使用addressof运算符.
  3. 我之所以希望通过引用传递 struct ,是因为我传递的 struct 很大,并且通过值传递它会对内存造成很大的负担(不太可能),或者如果我想对传递的副本进行更改(更有可能).
  4. 作为3.)的推论,我应该按值传递,除非我有上述其中一个理由按引用传递.

我的假设正确吗?还是我错过了指针上的标记?

推荐答案

你的假设是正确的.关于#3,Go是并发语言,goroutines中的引用传递使它们都读取相同的安全 struct ,但也使它们修改相同的危险 struct .

Go相关问答推荐

向路由发送获取请求时Golang中出现404错误

Kafka消费者在需要时不会暂停

如何在VSCode中为特定的.go文件创建调试配置?

转到http服务器头内容-类型设置为多部分/表单-数据,但在客户端获取内容-类型:文本/纯文本

在整个SQL事务中将使用上下文作为默认设置吗?

无法使用Segentio;S Kafka-Go连接到融合的Kafka

Kafka架构注册表-Broker:Broker无法验证记录

我可以在Golang中的另一个类型参数的基础上约束一个类型的参数吗?

为什么要立即调用内联函数,而不仅仅是调用其包含的函数?

我的神经网络(从头开始)训练,让它离目标更远

Gremlin-Go:树步骤不可序列化

如何在 gocql 中设置最大池大小?

使用图像解码 JPEG 时 colored颜色 不正确.解码并写入 PDF?

Protobuf.Any - 从 json.RawMessage 解组

如何将一片十六进制字节转换为整数

Golang并发写入多个文件

如何正确为 Go 中的值设置多种类型?

Scanner.Buffer - 最大值对自定义拆分没有影响?

map和struct golang的合并

Go 错误:Is() 和 As() 声称是递归的,是否有任何类型实现错误接口并支持这种递归 - 无错误?