如何在Go中强制传递参数作为指针?

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风格的方式正确地做到这一点?

Agi*_*gis 5

在函数声明中没有办法做到这一点.

当参数不是指针时,您可以在运行时使用反射和恐慌.

但是,您可以考虑更改代码的设计.论证的具体类型无关紧要.它要么实现你需要的接口,要么不是.

演示:http://play.golang.org/p/7Dw0EkFzbx