你有一个golang切片结构,你想在那里改变一个条目。
type Type struct {
value int
}
func main() {
s := []Type{{0}, {0}}
// Prints [{0} {0}]
fmt.Println(s)
firstEntry := s[0]
firstEntry.value = 5
// Also prints [{0} {0}]
fmt.Println(s)
}
https://play.golang.org/p/32tpcc3-OD
使用括号运算符并修改其返回值不会更改切片本身。
执行此切片条目修改的推荐方法是什么?
答案 0 :(得分:8)
尝试
s[0].value = 5
这将进入切片的后备存储。还
p := &s[1]
p.value = 6
答案 1 :(得分:0)
您还可以直接获取slice元素的地址并取消引用:
func main() {
s := []Type{{0}, {0}}
// Prints [{0} {0}]
fmt.Println(s)
// De-reference the address of the slice element
(&s[0]).value = 5
// Prints [{5} {0}]
fmt.Println(s)
}
答案 2 :(得分:-2)
看起来golang中切片上的括号运算符按值返回。
我假设C ++ stl vector像语义一样返回引用。 (http://en.cppreference.com/w/cpp/container/vector/operator_at)
需要将修改后的值分配回切片索引。
type Type struct {
value int
}
func main() {
s := []Type{{0}, {0}}
// Prints [{0} {0}]
fmt.Println(s)
firstEntry := s[0]
firstEntry.value = 5
// Prints [{0} {0}]
fmt.Println(s)
s[0] = firstEntry
// Prints [{5} {0}]
fmt.Println(s)
}