附加到切片的多个实例

时间:2016-04-29 01:58:59

标签: go

如果我有两个指向切片s1,s2的指针,它们最初指向同一切片,是否可以附加到其中一个切片并使另一个切片也指向更新的切片?这似乎是一个问题,因为如果容量不足,附加到切片可能会创建一个新切片,其中复制了条目。

以下是Go Playground上稍微复杂的版本,更接近我的用例。也就是说,我的节点有一个指向(全局)队列的指针,该队列由一个片实现。当一个节点更新全局队列时,我希望它反映在另一个节点指向的切片中。

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

1 个答案:

答案 0 :(得分:0)

添加间接图层,即指针,可以帮助您解决这个问题 https://play.golang.org/p/R7JILCbYTF

package main

import (
    "fmt"
)

type queue *[]int

type node struct {
    id int
    list *queue
}

func (n *node) mutate(){
    newSlice := append(**n.list, 1)
    *n.list = &newSlice
}
func (n *node) get(idx int) int{
    return (*(*[]int)(*n.list))[idx]
}

func main() {
    /* Make empty queue */
    s:=make([]int, 0)
    q1:=queue(&s)
    fmt.Println(q1)

    /* Make new nodes */
    n1 := new(node)
    n1.id = 0
    n1.list = &q1
    fmt.Println(n1)

    n2 := new(node)
    n2.id = 1
    n2.list = n1.list
    fmt.Println(n2)

    /* Mutate node in n1 */
    n1.mutate()
    fmt.Println(n1, n2) // n1.list != n2.list
    fmt.Println(n1.list, n2.list)
    fmt.Println(n1.get(0))
    n2.mutate()
    fmt.Println(n2.get(0))
}