2016-11-29 105 views
1

为什么go有时候允许你调用函数而不捕获两个返回值?如:Golang:为什么要捕获某些函数返回值可选?

func TestGolang() { 
    myMap := make(map[string]string) 
    test := myMap["value"] 
    // or 
    test, success := myMap["value"] 
} 

而在其他时候,您需要捕获所有返回结果并使用空白标识符,如果您不想使用该值?

test := os.Stat("test") // fails 
test, _ := os.Stat("test") // only way to make it work 

我认为golang不支持单个函数的不同方法签名。第一个例子如何工作?我是否可以实现自己的函数,可选地返回错误或状态标志,但是如果第二个返回值没有被捕获,则不会错误输出?

+5

这不是可有可无的,这是一个通吃或无。 [在Golang返回图像“OK”上的正常功能(可能的重复http://stackoverflow.com/questions/28487036/return-map-like-ok-in-golang-on-normal-functions/28487270#28487270 ) – icza

+1

太糟糕了,Go有自己奇怪的技巧,用户甚至无法重现。它经常觉得Go是“作弊”。 – mpm

回答

7

事实上,golang不支持函数重载,所以你不能为一个函数定义不同的签名。但是,语言定义中的某些操作(如频道接收器或从地图获取数据)会因类似超载的行为而“受益”。

+0

如需更详细的信息,你可以看看这个答案:http://stackoverflow.com/questions/6986944/does-the-go-language-have-function-method-overloading –

+3

这是正确的。许多在语言定义的操作(特别是,输入的断言,映射值的检索,以及信道接收,虽然有可能是其它我遗忘)同时具有一个和两个值“版本”,与第二(可选)值,指示操作的“状态”(以及在类型断言的情况下,如果失败也可以防止恐慌)。但是,请注意,任何函数都可以通过忽略隐含忽略的* all *返回值来调用:https://play.golang.org/p/qdbcw5JtVK – Kaedys