goLang将struct传递给函数(args interface {})

时间:2015-12-14 03:29:09

标签: go type-assertion

这是我的代码 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不打印Hello 不知道为什么。有人可以澄清吗? 提前致谢

2 个答案:

答案 0 :(得分:0)

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

z, ok := y.(*Msg)

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

foo := Msg{Message: "Hello"}

var foo Msg
foo.Message = "Hello"

答案 1 :(得分:0)

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

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

时,您将看到此错误

所以一种方法是

print(*foo)

或者

z, ok := y.(*Msg)