2016-04-29 11 views
1

最初に同じスライスを指すスライスs1、s2へのポインタが2つある場合は、スライスの1つに追加して、もう一方のスライスも更新されたスライスを指し示すことができます?これは、容量が不足している場合にコピーされたエントリを持つ新しいスライスをスライスに追加する可能性があるため、問題であると考えられます。スライスの複数のインスタンスに追加する

以下は、私の使用例に近いGo Playgroundのやや複雑なバージョンです。つまり、私はスライスによって実装されている(グローバル)キューへのポインタを持つノードを持っています。あるノードがグローバルキューを更新するとき、そのノードが他のノードが指すスライスに反映させたい。

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

答えて

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)) 
} 
これをうまく助けることができ、間接的な層、すなわちポインタを追加します。
関連する問題