慕运维8079593

Slice 基本上只是对底层数组、起始指针、长度和容量的引用。因此,如果可能的话,请考虑以下事项:sliceOfStrings := []string{"one", "two", "three"}// prints ONE TWO THREEfor i := range sliceOfStrings {    fmt.Println(strings.ToUpper(sliceOfStrings[i]))}// imagine this is possiblevar sliceOfInterface = []interface{}(sliceOfStrings)// since it's array of interface{} now - we can do anything// let's put integer into the first positionsliceOfInterface[0] = 1// sliceOfStrings still points to the same array, and now "one" is replaced by 1fmt.Println(strings.ToUpper(sliceOfStrings[0])) // BANG!此问题存在于 Java 和 C# 中。在实践中它很少发生,但仍然发生。鉴于在 Go 中没有像 int32 -> int64 这样的自动类型转换,如果你真的想将 []string 作为 []interface{} 发送,你被迫创建一个 []interface{} 副本是有道理的。这样就不会令人惊讶了 - 你明确地写了它,你知道你在做什么。如果函数会修改 []interface{} - 它不会伤害原始的 []string。
0 0