C++中的Const引用和Golang中的等效引用

Geo*_*nov 6 go

我来自C++世界和C++,通常当你关心性能而你不需要改变对象时,你使用常量引用传递它

void func(const std::string& str)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,字符串未被复制,并且无法在函数中进行修改.

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

  • 按价值,然后你不能修改(或实际上你可以但它没有意义)它,但它非常消耗内存
  • 通过指针,这可以从内存条款中获得好处,但您可以修改对象.

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

One*_*One 5

Go中没有直接等效项。

  1. 如果对象很大(大于32-64字节)和/或需要更改,则通过指针传递。
  2. 如果上述规则不适用,请按值传递。
  3. maps / channels / slices是引用类型,它们包含内部指针,因此除非您计划可能传递nil或想要将其附加(不修改已包含的元素)到切片,否则不需要通过指针传递它们。

例:

func doMap(m *map[string]string) {
    if *m == nil {
        *m = map[string]string{}
    }
    .....
}
Run Code Online (Sandbox Code Playgroud)

  • map/channel 实际上是通过引用隐式传递的。 (2认同)