Golang多重返回重载是否对地图类型是唯一的?

问题描述 投票:2回答:3

这两个都有效:

m := make(map[int]int)
elem, ok := m[1]
elem = m[1]

然而,这不允许:

func overload() (int, int) {
    return 1, 1
}

func overload() int {
    return 1
}

func main() {
    x := overload()
    x, y := overload()
}

另外,是否有一个没有概括的内置语法列表?我一直对什么是特殊语法感到困惑,即map[string]intmake([]int, 10)以及该语言的一部分。

syntax go overloading
3个回答
1
投票

即使两个函数在参数或返回值中具有不同的arity,或者即使参数具有不同的参数或返回类型,Go也不支持重载。

http://golang.org/doc/faq#overloading

据我所知,内置插件没有特殊标识符或特殊规则列表。然而,它们似乎很少而且介于两者之间。


6
投票

这是特殊的语法。除了地图键检查,至少type assertionchannel receive有单元素和双元素版本。在所有这些情况下,第二个元素是在文档示例中称为boolok;对于类型断言,它表示断言是否成功,并且对于通道接收它说明通信是否成功(如果通道关闭且为空,则为false)。

for...range有自己的,不同的单元素和双元素版本,但也许range更明显特别。

有一个list of built-in functions。如果你真的想知道所有的角落情况,go over the spec - 它很短,没有陷入一些标准文件的各种细节,并且值得花时间一旦你玩了一点语言。 (Effective Gothe FAQ也属于这一类。)


0
投票

给出的示例不是方法重载。

第一个示例:显示密钥是否存在于地图中。

m := make(map[int]int)
elem, ok := m[1]
elem = m[1]

elem将从地图中获得值“1”或“零值”,如果“foo”实际存在于地图中,则ok将收到将设置为true的布尔值。

官方网站:Go not support overloading of methods and operators?

如果不需要进行类型匹配,则简化方法调度。使用其他语言的经验告诉我们,使用具有相同名称但签名不同的各种方法偶尔会有用,但在实践中它也可能令人困惑和脆弱。仅根据名称进行匹配并要求在类型中保持一致性是Go类型系统中的主要简化决策。

Golang支持可变参数函数和方法。这是另一种你可以(或多或少)在Golang中执行函数和方法重载的方法。

可变函数或方法是接受可变数量的参数的函数或方法。

Example

o1 := Overload(1, 2, 3)
o2 := Overload(153, 196883, 1729, 1634, 5, 36)
o3 := Overload(1, -2)

有关详细信息,请查看此帖:Function and Method Overloading in Golang.

© www.soinside.com 2019 - 2024. All rights reserved.