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

goLang pass struct to function (args interface{})

这是我的代码 http://play.golang.org/p/h0N4t2ZAKQ

package main

import (
    "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不打印你好 不知道为什么。有人可以澄清吗? 提前致谢

您程序中 foo 的类型是 *Msg(指向 Msg 的指针),而不是 Msg。您需要在 print (http://play.golang.org/p/MTi7QhSVQz) 中将 y 转换为 *Msg:

z, ok := y.(*Msg)

或者您可以使用 Msg 输入 foo (http://play.golang.org/p/XMftjVtzBk):

foo := Msg{Message: "Hello"}

var foo Msg
foo.Message = "Hello"

如果您 运行 您的程序,您会注意到的一件事是 "ok" 的值为 false,这就是您的 print 语句未被执行的原因。如果从 z, ok := y.(Msg) 中删除 "ok",您将看到 Go 在执行此断言语句时抛出的错误。有了 ok,Go 就不会恐慌,如果断言失败,Go 将 return false。你的情况就是这样。

断言失败的原因是,打印方法中的类型是 Msg(main.Msg),但传递的是指针,即 *main.Msg。当你不使用 "ok"

时你会看到这个错误

所以一种方法是

print(*foo)

z, ok := y.(*Msg)