为了账号安全,请及时绑定邮箱和手机立即绑定

goLang 将结构传递给函数(参数接口{})

goLang 将结构传递给函数(参数接口{})

Go
慕的地6264312 2021-11-29 16:08:52
这是我的代码 http://play.golang.org/p/h0N4t2ZAKQpackage mainimport (    "fmt"    "reflect")type Msg struct {    Message string}func print(y interface{}) {    z, ok := y.(Msg)    fmt.Println(reflect.TypeOf(z))    fmt.Println("Value of ok ", ok)    if ok {        fmt.Println("Message is "+ z.Message)    }}func main() {    foo := new(Msg)    foo.Message="Hello"    fmt.Println("Messege in main "+foo.Message)    print(foo)}当我运行它时 z.Message 不打印 Hello 不知道为什么。有人可以澄清吗?提前致谢
查看完整描述

2 回答

?
长风秋雁

TA贡献1757条经验 获得超7个赞

foo程序中的类型是*Msg(指向 Msg 的指针),而不是Msg. 你需要转换y*Msgprinthttp://play.golang.org/p/MTi7QhSVQz):

z, ok := y.(*Msg)

或者,您可以使用Msg类型foohttp://play.golang.org/p/XMftjVtzBk):

foo := Msg{Message: "Hello"}

或者

var foo Msg
foo.Message = "Hello"


查看完整回答
反对 回复 2021-11-29
?
LEATH

TA贡献1936条经验 获得超6个赞

如果你运行你的程序,你会注意到的一件事是“ok”的值是假的,这就是如果没有执行你的打印语句的原因。如果您从 z, ok := y.(Msg) 中删除“ok”,您将看到 Go 在执行此断言语句时抛出的错误。确定后,Go 不会恐慌,如果断言失败,将返回 false。您的情况正在发生这种情况。

断言失败的原因是,预期,打印方法中的类型是 Msg(main.Msg),但传递的是指针,即 *main.Msg。当你不使用“ok”时你会看到这个错误

所以一种方法是

print(*foo)

或者

z, ok := y.(*Msg)


查看完整回答
反对 回复 2021-11-29
  • 2 回答
  • 0 关注
  • 164 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信