英文:
Is the Golang multiple return overloading unique to the map type?
问题
这两个都可以工作:
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)
,以及什么是语言的一部分。
英文:
These both work:
m := make(map[int]int)
elem, ok := m[1]
elem = m[1]
Yet, this not allowed:
func overload() (int, int) {
return 1, 1
}
func overload() int {
return 1
}
func main() {
x := overload()
x, y := overload()
}
Also, is there a list of built-in syntax that doesn't generalize? I keep getting confused on what is a special syntax, i.e. map[string]int
, make([]int, 10)
and what is part of the language.
答案1
得分: 7
这是特殊的语法。除了映射键检查之外,至少type assertion和channel receive都有一元和二元版本。在所有这些情况下,第二个元素是一个名为ok
的bool
,在文档示例中,对于类型断言,它表示断言是否成功,对于通道接收,它表示通信是否成功(如果通道关闭且为空,则为false
)。
for...range
有自己不同的一元和二元版本,尽管也许range
更明显地是特殊的。
有一个内置函数列表。如果你真的想了解所有的边界情况,可以阅读规范,它非常简短,没有像某些标准文档那样被细节所困扰,一旦你熟悉了这门语言,阅读规范是值得的。(Effective Go和常见问题也属于这个类别。)
英文:
It's special syntax. Besides the map key check, at least type assertion and channel receive have one- and two-element versions. In all those cases, the second element is a bool
called ok
in the doc examples; for type assertions it says whether the assertion succeeded and for channel receives it says whether the communication succeeded (false
if the channel is closed and empty).
for...range
has its own, different one- and two-element versions, though maybe range
is more-obviously special.
There is a list of built-in functions. If you really want to know all of the corner cases, go over the spec--it is pretty short, not bogged down in the sorts of details some standards documents are, and worth the time once you've played with the language a bit. (Effective Go and the FAQ are also in this category.)
答案2
得分: 1
Go语言不支持函数重载,即使两个函数在参数或返回值的数量上有所不同,或者参数具有不同的参数或返回类型。
http://golang.org/doc/faq#overloading
据我所知,没有特殊标识符或特殊规则的列表,可以让内置函数逃脱。然而,它们似乎很少见。
英文:
Go doesn't support overloading even if the two functions have different arity in parameters or return values or even if the parameters have different parameter or return types.
http://golang.org/doc/faq#overloading
There is no list of special identifiers or special rules that the built-ins get away with as far as I know. However, they seem to be few and far in-between.
答案3
得分: 0
你给出的示例并不是方法重载。
第一个示例:判断映射中是否存在键。
m := make(map[int]int)
elem, ok := m[1]
elem = m[1]
elem
将接收到来自映射的值 "1" 或者 "零值",ok
将接收到一个布尔值,如果 "foo" 实际上存在于映射中,则设置为 true。
官方网站:Go 不支持方法和运算符的重载吗?
如果方法调度不需要进行类型匹配,那么方法调度就会变得简单。其他语言的经验告诉我们,具有相同名称但不同签名的各种方法有时很有用,但在实践中可能会令人困惑和脆弱。Go 语言的类型系统在名称匹配和类型一致性方面的要求是一个重要的简化决策。
Go 语言支持可变参数函数和方法。这是在 Go 语言中实现函数和方法重载的另一种方式。
可变参数函数或方法是接受可变数量参数的函数或方法。
示例:
o1 := Overload(1, 2, 3)
o2 := Overload(153, 196883, 1729, 1634, 5, 36)
o3 := Overload(1, -2)
如果需要更多详细信息,你可以查看这篇文章:在 Go 语言中实现函数和方法重载。
英文:
The example you are given are not method overloading.
1st Example: Show whether key exist in map or not.
m := make(map[int]int)
elem, ok := m[1]
elem = m[1]
elem
will receive either the value of "1" from the map or a "zero value" and ok will receive a bool that will be set to true if "foo" was actually present in the map.
Officially Site: Go not support overloading of methods and operators?
> Method dispatch is simplified if it doesn't need to do type matching
> as well. Experience with other languages told us that having a variety
> of methods with the same name but different signatures was
> occasionally useful but that it could also be confusing and fragile in
> practice. Matching only by name and requiring consistency in the types
> was a major simplifying decision in Go's type system.
Golang supports variadic functions and methods. That is a another way you can (more or less) do function and method overloading in Golang.
> A variadic function or method is a function or method that accepts a
> variable number of parameters.
o1 := Overload(1, 2, 3)
o2 := Overload(153, 196883, 1729, 1634, 5, 36)
o3 := Overload(1, -2)
For more details you can look to this post: Function and Method Overloading in Golang.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论