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编程语言的特殊功能。”它在规范中吗?可能与