这两个都有效:
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]int
,make([]int, 10)
以及该语言的一部分。
即使两个函数在参数或返回值中具有不同的arity,或者即使参数具有不同的参数或返回类型,Go也不支持重载。
http://golang.org/doc/faq#overloading
据我所知,内置插件没有特殊标识符或特殊规则列表。然而,它们似乎很少而且介于两者之间。
这是特殊的语法。除了地图键检查,至少type assertion和channel receive有单元素和双元素版本。在所有这些情况下,第二个元素是在文档示例中称为bool
的ok
;对于类型断言,它表示断言是否成功,并且对于通道接收它说明通信是否成功(如果通道关闭且为空,则为false
)。
for...range
有自己的,不同的单元素和双元素版本,但也许range
更明显特别。
有一个list of built-in functions。如果你真的想知道所有的角落情况,go over the spec - 它很短,没有陷入一些标准文件的各种细节,并且值得花时间一旦你玩了一点语言。 (Effective Go和the FAQ也属于这一类。)
给出的示例不是方法重载。
第一个示例:显示密钥是否存在于地图中。
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中执行函数和方法重载的方法。
可变函数或方法是接受可变数量的参数的函数或方法。
o1 := Overload(1, 2, 3)
o2 := Overload(153, 196883, 1729, 1634, 5, 36)
o3 := Overload(1, -2)
有关详细信息,请查看此帖:Function and Method Overloading in Golang.