juk*_*uke 1 parameters struct pointers go
我正在实现一个在Go中使用JSON的应用层网络协议.
func ReadMessage(conn net.Conn, returnMessage interface{}) bool {
messageBytes := // read from conn
error := json.Unmarshal(messageBytes, &returnMessage)
if error != nil {
return false
}
return true
}
Run Code Online (Sandbox Code Playgroud)
该函数将struct作为其第二个参数,其中消息是unmarshalled.该函数可以像这样调用:
msg := MessageType1{}
ok := ReadMessage(conn, &msg)
Run Code Online (Sandbox Code Playgroud)
或没有&符号(&)
msg := MessageType1{}
ok := ReadMessage(conn, msg)
Run Code Online (Sandbox Code Playgroud)
这将编译,但不会做什么应该因为结构作为副本传递,而不是作为引用,原始的msg将保持为空.所以我想通过引用强制传递结构并在编译时捕获此错误.
将参数类型更改为*interface {}将无法编译:
cannot use &msg (type *MessageType1) as type *interface {} in function argument:
*interface {} is pointer to interface, not interface
Run Code Online (Sandbox Code Playgroud)
是否有一些Go风格的方式正确地做到这一点?
在函数声明中没有办法做到这一点.
当参数不是指针时,您可以在运行时使用反射和恐慌.
但是,您可以考虑更改代码的设计.论证的具体类型无关紧要.它要么实现你需要的接口,要么不是.
演示:http://play.golang.org/p/7Dw0EkFzbx