函数返回变量的地址...最终是另一个变量吗?

时间:2019-01-25 02:09:00

标签: go

此代码:

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}
{}

see for yourself

这使我感到震惊:handle.State()返回handler.state的地址, 那么state(是&handler.state)和handler.state最终包含不同的东西(一个是空的,另一个不是)的可能性如何?

如果我将state := handler.State()更改为state := &handler.state,那么它将按照我期望的方式工作。

我在这里想念什么?

1 个答案:

答案 0 :(得分:9)

该方法正在接收方参数handler中的字段地址。每次调用该函数都会创建一个新的handler值。

使用指针接收器获得您期望的结果:

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

在这种情况下,该函数返回调用者的handler中字段的地址。