如何修改在golang中作为结构的切片元素?

时间:2016-12-13 17:42:50

标签: go

你有一个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

使用括号运算符并修改其返回值不会更改切片本身。

执行此切片条目修改的推荐方法是什么?

3 个答案:

答案 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)
}

https://play.golang.org/p/dMKqNgMda3