2016-12-13 2 views
0

У вас есть golang ломтик структур, и вы хотели бы изменить одну запись там.Как изменить элемент среза, который является структурой в 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

Использование оператора скобки и изменения его возвращения не изменяет сам срез.

Каков рекомендуемый способ внесения этой модификации записи в срез?

+0

просто положить его обратно в карту s [0] = firstEntry или использовать указатель –

ответ

2

Попробуйте

s[0].value = 5 

Это попадает в резервное хранилище среза. Также

p := &s[1] 
p.value = 6 
-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

+3

Все в Go передается по значению всегда. Зачем предполагать вещи? – Volker