在RPC处理程序函数中,我省略了第一个参数,如:
func (self Handler) GetName(int, reply *StructObj) {
}
并在主叫方
var reply StructObj
client.Call("Handler.GetName", 0, &reply)
因为我不需要GetName方法中的第一个参数,所以我省略了它的名字, 但是,我得到了:
gob: type mismatch in decoder: want struct type
我将GetName方法更改为GetName(id int,reply * StructObj)并且它可以正常工作。 我想知道为什么会这样?
答案 0 :(得分:6)
你在Go中遇到了一个棘手的函数定义语法方面。您不能拥有未命名的参数,并且可以命名参数int
,而func f(x, y, z Type)
是将所有三个变量声明为{{1}类型的快捷方式}。例如,Type
违反直觉声明func f(int, x string)
接受两个字符串,其中一个恰好名为f
。
int
package main
import "fmt"
func f(int, x string) {
fmt.Println("int is:", int)
fmt.Println("x is:", x)
}
func main() {
f("foo", "bar")
}
是的,这有点令人费解。我从来没有听过具体的想法,但也许它们保留了内置的类型名称,因此他们可以在以后引入新的内置类型而不会破坏已经存在的代码。
无论如何,这意味着你的第一个函数定义实际上并不接受int和int is: foo
x is: bar
,而是 *StructObj
名为*StructObj
而另一个名为{{ 1}}。因此,来自int
的错误消息实际上意味着客户端在预期reply
时传递了0。很有趣。