You have a golang slice of structs and you would like to change one entry in there.
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
Using the brackets operator and modifying its return does not change the slice itself.
What is the recommended way of doing this slice entry modification ?
Try
s[0].value = 5
This gets to the backing store of the slice. Also
p := &s[1]
p.value = 6
It looks like the brackets operator on a slice in golang returns by value.
I was assuming C++ stl vector like semantics where references are returned. (http://en.cppreference.com/w/cpp/container/vector/operator_at)
One needs to assign the modified values back to the slice indexes.
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)
}
You can also take the address of the slice element directly and de-reference it:
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)
}