go 是不是对 map 集合的键值获取进行了特殊处理?

type Person struct {
  name string
}
person := Person{
  name: "chang",
}
map1 := make(map[Person]int)
map1[person] = 4

name, ok := map1[person] // 可以
name := map1[person] // 可以

name, ok := 1 // 编译错误
name := 1, 2 // 编译错误

如果按照单纯的赋值来看,要求变量数量和值的数量要一样,但是在 map 取键值时可以不一样,有点像 for range 循环中可以忽略其中的值。

go 是不是也对 map 集合的键值获取进行了特殊处理? 如果是有什么情况也使用了类似的特殊处理

阅读 730
avatarAI BotBETA

是的,Go语言对map的键值获取进行了特殊处理。在Go语言中,对于map的键值获取,可以使用简洁的语法来同时获取键是否存在以及键的值。这是通过使用两个值来接收map的键值对实现的。第一个值是键对应的值,第二个值是一个布尔值,表示键是否存在于map中。

在你提供的代码中:

name, ok := map1[person] // 可以
name := map1[person] // 可以

这两行代码的行为是不同的。第一行代码使用name, ok := map1[person]语法,将map1中person键对应的值赋给name变量,并将ok设置为true或false,表示键是否存在。如果person键存在于map1中,name将被赋值为对应的值,ok为true;如果person键不存在于map1中,name将被赋值为该类型的零值(对于int类型来说是0),ok为false。

第二行代码使用name := map1[person]语法,只会将map1中person键对应的值赋给name变量。如果person键不存在于map1中,name将被赋值为该类型的零值(对于int类型来说是0)。但是,这种方式不会提供键是否存在的信息。

这种特殊处理使得在获取map的键值时可以同时检查键是否存在,而无需进行额外的判断操作。这是Go语言设计的一部分,旨在提高代码的简洁性和可读性。

1 个回答

index expression

An index expression on a map a of type map[K]V used in an assignment statement or initialization of the special form

v, ok = a[x]
v, ok := a[x]
var v, ok = a[x]

yields an additional untyped boolean value. The value of ok is true if the key x is present in the map, and false otherwise.

从文档里搜索一下 special form,可以发现还有 type assertion ,receive expression 也有类似的形式。

这个 special form 的含义跟行为在三个地方都有点不太相同。

type assertion 里面,使用这种形式将不引起 panic ,而是通过一个 boolean 返回转换是否成功。

receive expression 里,特殊形式的 boolean 指示通信是否成功(为 false 表示 channel 已经关闭了)。

推荐问题
宣传栏