go - C++ 中的 Const 引用和 Golang 中的等价物

标签 go

我来自 C++ 世界,在 C++ 中,通常当您关心性能并且不需要更改对象时,您可以使用常量引用传递它

void func(const std::string& str)

在这种情况下,字符串未被复制并且不能在函数中修改。

我知道,在 Go 中有两种传递对象的方法:

  • 按值,然后你不能修改(或者实际上你可以但它没有意义)它,但它非常耗费内存
  • 通过指针,从内存的角度来说是好的,但是可以修改object。

那么,最好的方法是什么?总是通过指针传递对象,即使你不想修改它,因为它更快?或者有一些编译器优化,即使您按值发送它,有时它也会作为引用发送?

最佳答案

Go 中没有直接的等价物。

  1. 如果对象很大(~大于 32-64 字节)和/或需要更改,则通过指针传递。
  2. 如果上述规则不适用,则按值传递。
  3. maps/channels/slices 是引用类型,它们包含内部指针,所以你不需要通过指针传递它们,除非你计划可能传递一个 nil 或想追加(而不是修改已经包含的元素)到一个 slice 。

例子:

func doMap(m *map[string]string) {
    if *m == nil {
        *m = map[string]string{}
    }
    .....
}

关于go - C++ 中的 Const 引用和 Golang 中的等价物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36551835/

相关文章:

go - 无法在 GORM 中设置 has-many 关联

pointers - Golang 编辑从 main() 到函数的 struts 数组

go - 如何使用 mapstructure 标签作为 json 标签?

unit-testing - 如何在 golang 中动态跳过测试?

go - nohup 返回到 golang 中的程序

docker - 我的管道不允许我通过 golang 连接,尽管它可以在开发环境中工作

go - 如何在没有泛型的情况下对这种复合类型层次结构进行建模

algorithm - Go:用于字符串比较的多项式指纹

database - 未找到实体时的正确错误处理

go - 将 interface{} 转换为在运行时计算的类型