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)
这是我的代码 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)