在RPC处理函数中,我省略了第一个参数,如:
func (self Handler) GetName(int, reply *StructObj) {
}
Run Code Online (Sandbox Code Playgroud)
并在呼叫方
var reply StructObj
client.Call("Handler.GetName", 0, &reply)
Run Code Online (Sandbox Code Playgroud)
因为我不需要GetName方法中的第一个参数,所以我省略了它的名字,但是我得到了:
gob: type mismatch in decoder: want struct type
Run Code Online (Sandbox Code Playgroud)
我将GetName方法更改为GetName(id int,reply*StructObj)并且它可以工作.我想知道为什么会这样?
你在Go中遇到了一个棘手的函数定义语法方面.您不能拥有未命名的参数,并且可以命名参数int,并且func f(x, y, z Type)是将所有三个变量声明为类型的快捷方式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")
}
Run Code Online (Sandbox Code Playgroud)
当你运行它时,输出是
int is: foo
x is: bar
Run Code Online (Sandbox Code Playgroud)
是的,这有点令人费解.我从未听过具体的思路解释,但也许他们保留了内置的类型名称,因此他们可以在以后引入新的内置类型而不会破坏已经存在的代码.
无论如何,这意味着你的第一个函数定义实际上并没有接受一个int和*StructObj,但一个*StructObj名为int和另一个叫reply.所以来自net/rpc实际的错误消息意味着客户端在预期时传递了0 *StructObj.很有趣.
| 归档时间: |
|
| 查看次数: |
1540 次 |
| 最近记录: |