doulangyu9636 2019-01-25 02:09
浏览 28
已采纳

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

This code:

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
", state)
   fmt.Printf("%v
", handler.state)
}

Prints

&{bar}
{}

(see for yourself)

This buffles me: handle.State() returns the address of handler.state, so how is it possible that state (which is &handler.state) and handler.state end up containing different things (one is empty, the other is not)?

If I change state := handler.State() to state := &handler.state, then it works the way I expect it to.

What am I missing here?

  • 写回答

1条回答 默认 最新

  • dtrb96410 2019-01-25 02:11
    关注

    The method is taking the address of a field in the receiver argument handler. A new handler value is created on every invocation of the function.

    Use a pointer receiver to get the results you expect:

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

    In this case, the function returns the address of the field in the caller's handler.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 用ns3仿真出5G核心网网元
  • ¥15 matlab答疑 关于海上风电的爬坡事件检测
  • ¥88 python部署量化回测异常问题
  • ¥30 酬劳2w元求合作写文章
  • ¥15 在现有系统基础上增加功能
  • ¥15 远程桌面文档内容复制粘贴,格式会变化
  • ¥15 关于#java#的问题:找一份能快速看完mooc视频的代码
  • ¥15 这种微信登录授权 谁可以做啊
  • ¥15 请问我该如何添加自己的数据去运行蚁群算法代码
  • ¥20 用HslCommunication 连接欧姆龙 plc有时会连接失败。报异常为“未知错误”