猿问

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

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


慕的地6264312
浏览 165回答 2
2回答

长风秋雁

foo程序中的类型是*Msg(指向 Msg 的指针),而不是Msg. 你需要转换y到*Msg中print(http://play.golang.org/p/MTi7QhSVQz):z, ok := y.(*Msg)或者,您可以使用Msg类型foo(http://play.golang.org/p/XMftjVtzBk):foo := Msg{Message: "Hello"}或者var foo Msg foo.Message = "Hello"

LEATH

如果你运行你的程序,你会注意到的一件事是“ok”的值是假的,这就是如果没有执行你的打印语句的原因。如果您从 z, ok := y.(Msg) 中删除“ok”,您将看到 Go 在执行此断言语句时抛出的错误。确定后,Go 不会恐慌,如果断言失败,将返回 false。您的情况正在发生这种情况。断言失败的原因是,预期,打印方法中的类型是 Msg(main.Msg),但传递的是指针,即 *main.Msg。当你不使用“ok”时你会看到这个错误所以一种方法是print(*foo)或者z, ok := y.(*Msg)
随时随地看视频慕课网APP

相关分类

Go
我要回答