【问题标题】:The argument in golang RPC callgolang RPC调用中的参数
【发布时间】:2014-11-09 18:24:52
【问题描述】:

在 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) 并且它有效。 我想知道为什么会这样?

【问题讨论】:

  • 您可以使用下划线表示您不想要该变量。 GetName(_ int, reply *StructObj).

标签: go rpc


【解决方案1】:

您在 Go 中遇到了函数定义语法的一个棘手方面。你不能有一个未命名的参数,你可以命名一个参数intfunc 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")
}

When you run it,输出为

int is: foo
x is: bar

是的,这有点令人费解。我从来没有听过解释过具体的想法,但也许他们保留了内置类型名称,以便他们以后可以引入新的内置类型而不会破坏已经存在的代码。

无论如何,这意味着您的第一个函数定义实际上并不接受 int 和 *StructObj,而是 一个名为 int*StructObj 和另一个名为 reply 的函数。所以来自net/rpc 的错误消息实际上意味着客户端在期望*StructObj 时传递了一个0。挺好玩的。

【讨论】:

  • 哇!!我从来不知道 go 会尊重 'int' 作为变量的名称!谢谢!!
  • 它还匹配结构与“嵌入”匿名字段的绑定行为。 golang.org/ref/spec#Struct_types
猜你喜欢
  • 1970-01-01
  • 2018-12-13
  • 1970-01-01
  • 2020-11-29
  • 2012-10-02
  • 2017-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多