如何使用go复制公共变量?

如何使用go复制公共变量?,go,Go,如何使用go复制公共变量 例如,一个名为PublicVar的公共变量布尔 a := []string{"A", "B"} b := a fmt.Printf("%v\n", a) fmt.Printf("%v\n", b) b[0] = "C" fmt.Printf("%v\n", a) fmt.Printf("%v\n", b) // a has been changed. PublicVar的名称将被更改,但这不是我想要的 我只想复制PublicVar的值。发生这种情况的原因可能是Pub

如何使用go复制公共变量

例如,一个名为PublicVar的公共变量布尔

a := []string{"A", "B"}
b := a
fmt.Printf("%v\n", a)
fmt.Printf("%v\n", b)

b[0] = "C"
fmt.Printf("%v\n", a)
fmt.Printf("%v\n", b)
// a has been changed.
PublicVar的名称将被更改,但这不是我想要的


我只想复制PublicVar的值。

发生这种情况的原因可能是
PublicVar
是指向实例的指针。所以
temp
也指向同一个实例。您可以通过以下方式获得值类型

temp := *PublicVar
temp.name = "bob"
参见上的示例


编辑:由于问题被编辑以显示关注的变量是一个片段,因此khrm的相关性更高。

发生这种情况的原因可能是
PublicVar
是指向实例的指针。所以
temp
也指向同一个实例。您可以通过以下方式获得值类型

temp := *PublicVar
temp.name = "bob"
参见上的示例


编辑:由于问题被编辑以显示关注变量是一个片段,因此khrm的相关性更高。

按值复制。但对于贴图和切片,有一个例外,即只有它们的引用被复制,因为它们被实现为引用类型

对于切片,可以使用内置副本执行此操作:

b := make([]string, len(a))
copy(b,a)
如果是地图:

for k, v := range a {
    b[k] = v
}

按值复制。但对于贴图和切片,有一个例外,即只有它们的引用被复制,因为它们被实现为引用类型

对于切片,可以使用内置副本执行此操作:

b := make([]string, len(a))
copy(b,a)
如果是地图:

for k, v := range a {
    b[k] = v
}

temp:=PublicVar
复制该值,不执行其他操作。无法在Go(导出或未导出)中“更改变量的名称”。你想做什么?@Volker actually temp:=PublicVar并不总是复制该值。例如,如果PublicVar引用的是一个切片、一个通道或一个映射,那么temp也将引用数据的同一个副本。@Nipun这是因为切片、通道和映射都是引用类型。不是因为
:=
的行为不同。它总是复制值。对于切片、通道和映射,该值是一个引用。@感谢您的澄清。
temp:=PublicVar
复制该值,而不执行其他操作。无法在Go(导出或未导出)中“更改变量的名称”。你想做什么?@Volker actually temp:=PublicVar并不总是复制该值。例如,如果PublicVar引用的是一个切片、一个通道或一个映射,那么temp也将引用数据的同一个副本。@Nipun这是因为切片、通道和映射都是引用类型。不是因为
:=
的行为不同。它总是复制值。在切片、通道和映射的情况下,值是引用。@谢谢。请澄清。在我所怀念的内容中,构造函数、复制构造函数、赋值运算符几乎都是C++中使用的。我们在例子中看到的混淆和危险在C++中要小得多。我想复制一个切片而不是引用的值,什么是正确的方法?我错过的是构造函数、复制构造函数、赋值操作符,这些操作几乎总是在C++中使用。我们在例子中看到的混淆和危险在C++中要小得多。我要复制切片的值而不是引用,什么是正确的方式?