这两者都有效:
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)
和什么是语言的一部分。
这是一种特殊的语法。除了映射键检查之外,至少类型断言和通道接收有一个和两个元素版本。在所有这些情况下,第二个元素是在文档示例中称为ok
的bool
;对于类型断言,它表示断言是否成功,对于通道接收,它表示通信是否成功(如果通道关闭且为空,则为false
)。
for...range
有它自己的,不同的单元素和双元素版本,尽管range
可能更明显地特别。
有一个内置函数列表。如果你真的想了解所有的角落案例,请仔细阅读规范——它很短,不会陷入一些标准文档的细节中,一旦你稍微熟悉了这种语言,就值得花时间。(Effective Go和FAQ也属于这一类。)
Go不支持重载,即使这两个函数在参数或返回值中具有不同的arity,或者即使参数具有不同的参数或返回类型。
http://golang.org/doc/faq#overloading
据我所知,没有内置程序可以逃脱的特殊标识符或特殊规则的列表。然而,它们似乎很少。
给出的示例不是方法重载。
第一个例子:显示键是否存在于地图中。
m := make(map[int]int)
elem, ok := m[1]
elem = m[1]
elem
将从映射中接收值"1"或"零值",ok将接收一个bool,如果映射中实际存在"foo",则该bool将设置为true。
官方网站:Go不支持重载方法和运算符?
如果方法调度不需要进行类型匹配,则会简化它也其他语言的经验告诉我们具有相同名称但不同签名的方法的偶尔有用,但在实践仅按名称匹配,并且要求类型一致是围棋类型系统中一个重要的简化决策。
Golang支持可变函数和方法。这是在Golang中(或多或少)进行函数和方法重载的另一种方法。
变差函数或方法是接受可变数量的参数。
示例:
o1 := Overload(1, 2, 3)
o2 := Overload(153, 196883, 1729, 1634, 5, 36)
o3 := Overload(1, -2)
有关更多详细信息,您可以查看这篇文章:Golang中的函数和方法重载。