新手问题:为什么在Golang Go语言中 Map 和 type assertion 可以既返回一个值,又可以返回两个值
map 可以:
value, present := m["key"]
value := m[“key”]
type assertion 可以
var i interface{} = "hello"
s := i.(string)
fmt.Println(s)
s, ok := i.(string)
fmt.Println(s, ok)
我自己创建一个 func
func hello() (string, error) {
return "world", nil
}
when invoke the func:
v, ok := hello() // valid
v := hello() // invalid
刚通过 golang tour 看了一天 golang 的语法,这里不太理解,想问下 map 和 type assertion 是怎么实现这种优雅的方式的。
新手问题:为什么在Golang Go语言中 Map 和 type assertion 可以既返回一个值,又可以返回两个值
更多关于新手问题:为什么在Golang Go语言中 Map 和 type assertion 可以既返回一个值,又可以返回两个值的实战教程也可以访问 https://www.itying.com/category-94-b0.html
语言就是这么设计的,你可以认为是语法糖,具体编译器会判断返回一个还是两个,而且只针对特定类型,比如 map , chan , range 和断言
更多关于新手问题:为什么在Golang Go语言中 Map 和 type assertion 可以既返回一个值,又可以返回两个值的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
返回一个值的时候,没有会 panic
断言会 panic , map 不会
在Golang(Go语言)中,Map
的访问和 type assertion
(类型断言)设计得可以返回一个或两个值,这是为了处理潜在的错误或缺失值情况,提供更强的错误处理能力和灵活性。
-
Map 访问:
- 当你尝试从一个
map
中获取一个键对应的值时,如果该键存在,则返回该值和一个布尔值true
。 - 如果该键不存在,则返回该类型的零值和一个布尔值
false
。这种设计允许你区分一个键是否真的存在于map
中,还是仅仅返回了一个零值。
- 当你尝试从一个
-
Type Assertion:
- 类型断言用于将一个接口类型的值转换为具体类型。如果接口值确实包含了这个具体类型的值,则类型断言成功,返回该值和一个布尔值
true
。 - 如果接口值不包含这个具体类型的值,则类型断言失败,返回该类型的零值和一个布尔值
false
,以及一个运行时错误(可以通过第二个返回的参数error
类型的变量捕获,但在类型断言的上下文中通常不直接使用)。
- 类型断言用于将一个接口类型的值转换为具体类型。如果接口值确实包含了这个具体类型的值,则类型断言成功,返回该值和一个布尔值
这种设计使得Go语言在处理不确定或可能出错的情况时更加明确和健壮。通过检查返回的布尔值,你可以确定操作是否成功,并据此作出适当的处理。这种模式在Go语言中非常常见,体现了其简洁而强大的错误处理哲学。