我正在尝试在Go中修改嵌套结构的变量的值。基本上,我想修改RsvpString
属性,但是GetRsvp()
似乎返回Rsvp
的值而不是引用,因此,当我修改其属性值时,它不会反射(reflect)在Event
实例中。
测试如下。
type Event struct {
Rsvps []Rsvp `json:"rsvps"`
}
type Rsvp struct {
UserId string `json:"userId"`
RsvpString string `json:"rsvp"`
}
func (e *Event) GetRsvp(userId string) (rsvp *Rsvp, err error) {
for _, element := range e.Rsvps {
if element.UserId == userId {
return &element, nil
}
}
return &Rsvp{}, fmt.Errorf("could not find RSVP based on UserID")
}
func (e *Event) UpdateExistingRsvp(userId string, rsvpString string) {
rsvp, err := e.GetRsvp(userId)
if err == nil {
rsvp.RsvpString = rsvpString
}
}
这是测试代码:
func TestEvent_UpdateExistingRsvp(t *testing.T) {
e := Event{[]Rsvp{
{Name: "Bill",
UserId: "bill",
Rsvp: "yes"}}}
e.UpdateExistingRsvp("bill", "no")
assert.Equal(t, "no", e.Rsvps[0].Rsvp, "RSVP should be switched to no") // fails
}
最佳答案
GetRsvp
返回循环变量的地址,而不是数组中元素的地址。修理:
for i, element := range e.Rsvps {
if element.UserId == userId {
return &e.Rsvps[i], nil
}
}
循环变量保留e.Rsvps [i]的副本,并且在每次迭代时都会被覆盖。如果返回循环变量的地址,则返回该副本的地址。
关于pointers - 如何修改嵌套结构的属性值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58967404/