如果我有两个指向切片s1,s2的指针,它们最初指向同一切片,是否可以附加到其中一个切片并使另一个切片也指向更新的切片?这似乎是一个问题,因为如果容量不足,附加到切片可能会创建一个新切片,其中复制了条目。
以下是Go Playground上稍微复杂的版本,更接近我的用例。也就是说,我的节点有一个指向(全局)队列的指针,该队列由一个片实现。当一个节点更新全局队列时,我希望它反映在另一个节点指向的切片中。
答案 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))
}