Функция возвращает адрес переменной ... заканчивается тем, что является другой переменной? - PullRequest
0 голосов
/ 25 января 2019

Этот код:

package main

import (
    "fmt"
    "encoding/json"
)


type State struct { Foo string }
type Handler struct { state State }

func (handler Handler) State() *State { return &handler.state }

func main() {
   input := `{"Foo": "bar"}`
   handler := Handler{}
   state := handler.State()
   json.Unmarshal([]byte(input), state)


   fmt.Printf("%v\n", state)
   fmt.Printf("%v\n", handler.state)
}

Отпечатки

&{bar}
{}

( убедитесь сами )

Это сбивает меня с толку: handle.State() возвращаетадрес handler.state, так как же возможно, что state (то есть &handler.state) и handler.state будут содержать разные вещи (одно пустое, другое нет)?

Если я изменю state := handler.State() на state := &handler.state, то это сработает так, как я ожидаю.

Что мне здесь не хватает?

1 Ответ

0 голосов
/ 25 января 2019

Метод принимает адрес поля в аргументе получателя handler.Новое значение handler создается при каждом вызове функции.

Используйте получатель указателя для получения ожидаемых результатов:

func (handler *Handler) State() *State { return &handler.state }

В этом случае функция возвращает адрес поля в handler.

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