新手问题:为什么在Golang Go语言中 Map 和 type assertion 可以既返回一个值,又可以返回两个值

http://stackoverflow.com/questions/36244725/golang-why-map-and-type-assertion-can-return-1-or-2-value

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

4 回复

语言就是这么设计的,你可以认为是语法糖,具体编译器会判断返回一个还是两个,而且只针对特定类型,比如 map , chan , range 和断言

更多关于新手问题:为什么在Golang Go语言中 Map 和 type assertion 可以既返回一个值,又可以返回两个值的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


返回一个值的时候,没有会 panic

断言会 panic , map 不会

在Golang(Go语言)中,Map 的访问和 type assertion(类型断言)设计得可以返回一个或两个值,这是为了处理潜在的错误或缺失值情况,提供更强的错误处理能力和灵活性。

  1. Map 访问

    • 当你尝试从一个 map 中获取一个键对应的值时,如果该键存在,则返回该值和一个布尔值 true
    • 如果该键不存在,则返回该类型的零值和一个布尔值 false。这种设计允许你区分一个键是否真的存在于 map 中,还是仅仅返回了一个零值。
  2. Type Assertion

    • 类型断言用于将一个接口类型的值转换为具体类型。如果接口值确实包含了这个具体类型的值,则类型断言成功,返回该值和一个布尔值 true
    • 如果接口值不包含这个具体类型的值,则类型断言失败,返回该类型的零值和一个布尔值 false,以及一个运行时错误(可以通过第二个返回的参数 error 类型的变量捕获,但在类型断言的上下文中通常不直接使用)。

这种设计使得Go语言在处理不确定或可能出错的情况时更加明确和健壮。通过检查返回的布尔值,你可以确定操作是否成功,并据此作出适当的处理。这种模式在Go语言中非常常见,体现了其简洁而强大的错误处理哲学。

回到顶部