Go 为什么映射和类型断言可以返回1或2个值?

Go 为什么映射和类型断言可以返回1或2个值?,go,type-assertion,Go,Type Assertion,要定义地图,我们可以执行以下操作: value,present:=m[“key”] 或: 值:=m[“键”] 使用类型断言,我们可以执行以下操作: var i interface{} = "hello" s := i.(string) fmt.Println(s) s, ok := i.(string) fmt.Println(s, ok) 但是我找不到一种方法来定义可以返回1值或2值的func 例如: func hello() (string, error) { return "

要定义地图,我们可以执行以下操作:

value,present:=m[“key”]

或:

值:=m[“键”]

使用类型断言,我们可以执行以下操作:

var i interface{} = "hello"

s := i.(string)
fmt.Println(s)

s, ok := i.(string)
fmt.Println(s, ok)
但是我找不到一种方法来定义可以返回1值或2值的func

例如:

func hello() (string, error) {
    return "world", nil
}
当我调用此函数时,我得到:

v, ok := hello() // valid
v := hello() // invalid
PS:我知道类似于
模板的东西是如何工作的。必须
工作,但它看起来不同。我真的很想知道映射和类型断言是如何发挥作用的,这样我就可以将它应用到函数中


提前谢谢。(我明白了吗?对不起,我的英语很差。)

映射和类型断言可以做到这一点,因为它们不是函数,而是语言的结构。规范中描述了该行为

赋值中使用的map[K]V类型映射上的索引表达式 或特殊窗体的初始化

v, ok = a[x]
v, ok := a[x]
var v, ok = a[x]
v, ok = x.(T)
v, ok := x.(T)
var v, ok = x.(T)
生成一个额外的非类型化布尔值。如果出现以下情况,则ok的值为真 键x出现在地图中,否则为false

类型的赋值或初始化中使用的类型断言 特殊形式

v, ok = a[x]
v, ok := a[x]
var v, ok = a[x]
v, ok = x.(T)
v, ok := x.(T)
var v, ok = x.(T)
生成一个额外的非类型化布尔值。如果出现以下情况,则ok的值为真 这个断言成立。否则为false,v的值为 类型T的值为零值。在这种情况下不会发生运行时死机

这不是可以在一般函数上完成的事情,因此
模式必须明确地再现相同的行为

函数类型表示具有相同属性的所有函数的集合 参数和结果类型

FunctionType   = "func" Signature .
Signature      = Parameters [ Result ] .
Result         = Parameters | Type .
Parameters     = "(" [ ParameterList [ "," ] ] ")" .
ParameterList  = ParameterDecl { "," ParameterDecl } .
ParameterDecl  = [ IdentifierList ] [ "..." ] Type .

空白标识符由下划线字符\表示

空白标识符提供了一种忽略右侧值的方法 在任务中:

x, _ = f()  // evaluate f() but ignore second result value

映射、类型断言和带有
range
子句的
for
语句是Go编程语言的特殊功能。对于普通函数类型,返回值的数目不能可变

你可以忽略一个带有下划线(返回)的值,空白标识符,或者你可以使用一个包装器函数。比如说,

package main

import "fmt"

func two() (int, bool) {
    return 42, true
}

func one() int {
    r, _ := two()
    return r
}

func main() {
    r, ok := two()
    r, _ = two()
    r = one()
    fmt.Println(r, ok)
}

“映射、类型断言和带有range子句的for语句是Go编程语言的特殊功能。”它在规范中吗?可能与