此代码:
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
,那么它将按照我期望的方式工作。
我在这里想念什么?
答案 0 :(得分:9)
该方法正在接收方参数handler
中的字段地址。每次调用该函数都会创建一个新的handler
值。
使用指针接收器获得您期望的结果:
func (handler *Handler) State() *State { return &handler.state }
在这种情况下,该函数返回调用者的handler
中字段的地址。