2016-04-29 2 views
1

Если у меня есть два указателя на срезы s1, s2, которые первоначально указывают на один и тот же срез, можно добавить к одному из срезов и добавить другой срез к обновленному фрагменту ? Это кажется проблемой, потому что добавление к срезам может сделать новый фрагмент с копиями, если количество ресурсов недостаточное.Добавление к нескольким экземплярам среза

Следующая небольшая версия на игровой площадке Go, которая ближе к моему варианту использования. А именно, у меня есть узлы, которые имеют указатель на (глобальную) очередь, которая реализуется срезом. Когда один узел обновляет глобальную очередь, я хочу, чтобы это отразилось на фрагменте, на который указывает другой узел.

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)) 
} 
Смежные вопросы