当前位置: 首页 > 知识库问答 >
问题:

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

逄学潞
2024-01-03
type Person struct {  name string}person := Person{  name: "chang",}map1 := make(map[Person]int)map1[person] = 4name, ok := map1[person] // 可以name := map1[person] // 可以name, ok := 1 // 编译错误name := 1, 2 // 编译错误

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

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

共有2个答案

湛光明
2024-01-03

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 已经关闭了)。

韦原
2024-01-03

是的,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语言设计的一部分,旨在提高代码的简洁性和可读性。

 类似资料:
  • 我通过从远程XML文件提取内容,使用如下代码: 正如您所看到的,这段代码中没有任何新的或奇怪的地方。 现在,在Android 3.0和更新的系统上,当获取的XML内容到达解析器时,它们看起来“正常”,就像下面的图片一样:

  • Map 是一种无序的键值对的集合。Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值。 Map 是一种集合,所以我们可以像迭代数组和切片那样迭代它。不过,Map 是无序的,我们无法决定它的返回顺序,这是因为 Map 是使用 hash 表来实现的。 定义 Map 可以使用内建函数 make 也可以使用 map 关键字来定义 Map: /* 声明变量,默认 map

  • 我的Freemarker模板中有变量。我如何在映射中的特定键处获取值,就像我们在Java中所做的那样()。 我知道如何在FTL中遍历映射的键和值。但是我想要一个没有迭代的解决方案,就像Java方法的接口一样。

  • 问题内容: http://golang.org/ref/spec#Import_declarations “ import”语法是专门用于导入软件包的吗?看起来像一个使用“;”的函数调用 而不是“,”进行参数化。似乎它甚至可能是红宝石风格的方法调用(即:sans“()”) PS 以为我想请他们对此有所了解。我真的很喜欢Go的工作,但是它的某些语法似乎有些不一致,有时有些冗长。我不知道要为它创建一个

  • 问题内容: 在主题函数返回的代码中迭代返回的映射时,键未按顺序显示。 我如何才能使键按顺序排列/对地图进行排序,以使键按顺序排列并且值对应? 这是代码。 问题答案: 在围棋博客:去映射在行动中有极好的说明。 当使用范围循环在地图上进行迭代时,未指定迭代顺序,并且不能保证每次迭代之间都相同。从Go 1开始,运行时间会随机化映射迭代顺序,因为程序员依赖于先前实现的稳定迭代顺序。如果需要稳定的迭代顺序,

  • 方法1, 通过SetupBy,将Ioc容器放到一个public的静态属性, 推荐. @SetupBy(MainSetup.class) public class MainModule {} public class MainSetup implements Setup { public static Ioc ioc; public void init(NutConf