单值上下文中的多值(go)

时间:2015-04-25 15:00:58

标签: go

以下代码返回错误multiple-value in single-value context。我无法理解为什么,因为它可以更清楚该函数有一个参数(我传递一个空字符串""),并返回一个字符串和一个错误(我将它分配给{ {1}}和r)。

err

2 个答案:

答案 0 :(得分:1)

正如评论中所述,删除&来自& cl.Start("")并且它会起作用 - 尽管你然后会收到关于错误被声明和未被使用的错误。

或者您可以将其写为(&cl).Start(""),这样也可以。

解释是here

  

有关接收器的指针与值的规则是可以在指针和值上调用值方法,但只能在指针上调用指针方法。

     

这个规则的出现是因为指针方法可以修改接收器;   在值上调用它们会导致该方法接收到的副本   值,所以任何修改都将被丢弃。语言   因此不允许这个错误。 但有一个方便的例外。   当值可寻址时,语言会处理常见问题   通过插入地址对值调用指针方法的情况   操作员自动。

以及here

  

如果方法集x(类型)x包含m并且参数列表可以分配给m的参数列表,则方法调用x.m()有效。如果x是可寻址的并且& x的方法集包含m,则x.m()是(& x).m()的简写

答案 1 :(得分:1)

这是运营商的优先事项。 &cl.Start()&(cl.Start())相同,不是您想要的。

使用括号来阐明您想要的是(&cl).Start()

或者您可以使用指针变量。

func main() {
    cl := &Some{}
    r, err := cl.Start("")
    fmt.Println(r)
}