Изменение ссылки на структуру внутри структуры - PullRequest
0 голосов
/ 30 сентября 2018

Я пытался обновить переменную карты внутри структуры, но безуспешно.

Я ожидал, что карты в Голанге передаются по ссылке и, следовательно, назначение одной ссылки на другую должно работать, но это не так.case.

Я мог бы упустить что-то очевидное здесь, и если это так, извинения!

package main

import (
        "fmt"
)

type Foo struct {
        t map[string]interface{}
}

func (F Foo) Set(ta map[string]interface{}) {
        F.t = ta
}
func (F Foo) Get() map[string]interface{} {
        return F.t
}

func main() {
        t := make(map[string]interface{})
        t["t"] = "sf"
        t["array"] = []int{1, 2, 3}

        fmt.Println(t) // prints map[t:sf array:[1 2 3]]
        var f Foo

        f.Set(t)
        // why the following?
        fmt.Println(f.t) //prints map[]

        f.t = t
        fmt.Println(f.t) //prints map[t:sf array:[1 2 3]]
}

Детская площадка: https://play.golang.org/p/i1ESV1BdjGQ

1 Ответ

0 голосов
/ 30 сентября 2018

По сути, вам нужен приемник-указатель на вашем методе Set, чтобы иметь возможность изменять состояние вашей структуры.

Методы с приемниками-указателями могут изменять значение, на которое указывает приемник.Поскольку методам часто требуется модифицировать свой приемник, приемники указателей встречаются чаще, чем приемники значений.

Get также должен иметь приемник указателей для согласованности:

Далееконсистенция.Если у некоторых методов этого типа должны быть указатели-получатели, у остальных тоже должны быть указатели, поэтому набор методов является согласованным независимо от того, как используется тип.Подробности см. В разделе о наборах методов .

См. обзор go для дополнительных примеров.

Вот исправлениеВаш код:

package main

import (
    "fmt"
)

type Foo struct {
    t map[string]interface{}
}

func (F *Foo) Set(ta map[string]interface{}) {
    F.t = ta
}
func (F *Foo) Get() map[string]interface{} {
    return F.t
}

func main() {
    t := make(map[string]interface{})
    t["t"] = "sf"
    t["array"] = []int{1, 2, 3}

    fmt.Println(t)
    var f Foo

    f.Set(t)
    fmt.Println(f.Get()) //prints map[t:sf array:[1 2 3]]

    f.t = t
    fmt.Println(f.Get()) //prints map[t:sf array:[1 2 3]]
}

Выходы

map[t:sf array:[1 2 3]]
map[t:sf array:[1 2 3]]
map[t:sf array:[1 2 3]]

Попробуйте сами здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...