golang RPC调用中的参数

时间:2014-09-16 05:41:36

标签: go rpc

在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)并且它可以正常工作。 我想知道为什么会这样?

1 个答案:

答案 0 :(得分:6)

你在Go中遇到了一个棘手的函数定义语法方面。您不能拥有未命名的参数,并且可以命名参数int,而func f(x, y, z Type)是将所有三个变量声明为{{1}类型的快捷方式}。例如,Type违反直觉声明func f(int, x string)接受两个字符串,其中一个恰好名为f

int

When you run it,输出

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。很有趣。