范围或地图返回什么?

2024-01-18

Go 有非常简洁的多返回值范例。但看起来像v, ok := map[key] and v, k := range m使用具有相同符号的不同机制。这是一个简单的例子:

func f2() (k, v string) {
    return "Hello", "World"
}

func main(){
    k := f2() // Doesn't work : multiple-value f2() in single-value context

    m := map[string]int{"One": 1}

    // It works
    v, ok := m["One"]

    // How it all work?
    v := m["One"]
    for k := range m {}
}

在上面的例子中,k := f2()给出错误为f2返回两个值,而v, ok := m["One"] and v := m["One"]- 两个表达式都可以正常工作,没有任何错误。 为什么会有不同的行为?


从内置中获取map, using range在地图、数组或切片上,以及type assertions允许一个or两个变量。用户定义的函数和方法并非如此。如果函数声明两个返回值,则必须告诉如何处理这两个值,或者忽略这两个值:

k, _ := f2() // Specify what to do with each returned value
f2() // Ignoring both

为什么?因为规范是这样说的:

映射(索引表达式): http://golang.org/ref/spec#Index_expressions

map[K]V 类型的映射 a 上的索引表达式可以用于特殊形式的赋值或初始化

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

其中索引表达式的结果是一对类型为 (V, bool) 的值。在这种形式中,如果键 x 存在于映射中,则 ok 的值为 true,否则为 false。 v 的值是单结果形式中的值 a[x]。

范围(用于声明): http://golang.org/ref/spec#For_statements

对于每次迭代,迭代值的生成如下:

极差表达式:m map[K]V
第一个值:键 k K
第二个值(如果存在第二个变量):m[k] V

类型断言: http://golang.org/ref/spec#Type_assertions

对于接口类型和类型 T 的表达式 x,主表达式
x.(T)
断言 x 不为 nil,并且存储在 x 中的值是 T 类型。

and

如果在表单的赋值或初始化中使用类型断言
v, ok = x.(T)
v, 好的 := x.(T)
var v, ok = x.(T)
断言的结果是一对类型为 (T, bool) 的值

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

范围或地图返回什么? 的相关文章

随机推荐

  • 如何在同一查询中使用 __year 和 __in ?

    这就是我正在尝试做的事情 例如 我有一个包含年份的列表years 2002 2003 2004 我有一个SomethingModel with a DateField 我想做一个查询 该查询将返回属于该年的所有对象 我知道这个作品 Some
  • 如何解决递归异步承诺?

    我正在玩弄承诺 并且在异步递归承诺方面遇到了麻烦 场景是一名运动员开始跑 100m 我需要定期检查他们是否完成 一旦完成 打印他们的时间 编辑以澄清 在现实世界中 运动员在服务器上运行 startRunning涉及对服务器进行 ajax 调
  • 声明一个克隆函数以使只读属性在 TypeScript 中可写?

    我只读了打字稿中的数据和clone功能 class Data readonly foo string const ro Data foo bar how to declare clone so that it returns writabl
  • 忽略 python 警告

    我想忽略所有UserWarning在我的开发环境中 这样它们就不会打印到我的错误日志文件中 我读过的文档warnings模块 并尝试了类似的东西 import warnings import the module that warns wa
  • 使用 AuthLogic 在 ROR 中创建会话后,Current_user nil

    我在 AuthLogic 和 current user 方面遇到一些问题 我有一个 Flex4 应用程序 使用 Cairngorm 框架作为前端 使用 Ruby On Rails 作为后端 我可以通过浏览器正常登录 并且仅使用 ROR 时
  • 在更改事件之前确定 jQuery Mobile 页面的调用者

    我认为这是同一个问题JQM pagebeforechange 和事件源 https stackoverflow com questions 9179096 jqm pagebeforechange and event source 但那里没
  • iOS Daemon 应用程序无法启动(越狱)- 如何调试?

    我正在为越狱的 iPhone 构建一个守护程序应用程序 并遵循 stackoverflow 上的几个问题和答案中描述的指导原则 当然还有 Chris Alvares 的网页 http chrisalvares com blog 38 cre
  • Spring MVC“重复”部分 URL

    我有一个简单的 Controller在一个spring mvc环境 这是控制器 Controller public class MessageController private static Logger LOG LoggerFactor
  • Quasar2 Vue3 Cypress 滑动切换状态与 Cypress 浏览器上显示的内容不匹配

    我的 vue 模板
  • 在 Angular 8 的新选项卡中打开 url 时如何使用状态传递数据

    在同一选项卡中打开网址时 我可以使用状态传递数据 我使用了以下代码片段 a click here a 但是 当我尝试使用 target blank 属性进行相同操作以在新选项卡中打开时 我无法从状态获取数据 a target blank c
  • ASP.NET MVC 3 最佳实践/设计

    我花了很多时间寻找使用 EF 4 1 或其他 ORM 设计 ASP NET MVC 3 网站的最佳实践 我找到了这个在 ASP NET MVC 应用程序中实现存储库和工作单元模式的教程 http www asp net mvc tutori
  • 如何清除绑定到 Google 地点自动完成的输入?

    这是我的问题 我正在使用 Google 地点自动完成功能从用户那里收集有关地点的信息 在事件 place changed 中 我保存此信息 不过 我想让用户可以添加多个位置 所以在保存这个地方后我想清除输入 但是 Google 自动完成功能
  • 修改foreach循环中的数组值[重复]

    这个问题在这里已经有答案了 我想知道是否可以编辑正在处理的当前对象foreach loop 我正在处理一系列对象 questions我想在我的数据库中浏览并查找与该问题对象相关的答案 因此 对于每个问题 获取答案对象并更新当前的 quest
  • 在显示表格单元格中使用边距[重复]

    这个问题在这里已经有答案了 我尝试在 li 中添加 margin left margin right 但它没有给它们之间留出空间 我应该添加什么来在列表之间留出一个空格 CSS btn top float right height 40px
  • Windows Azure 开发存储 Blob 服务未启动

    当我启动开发存储模拟器时 出现错误 The process cannot access the file because it is being used by another process 我猜这只发生在 BLOB 上 其他服务 即队列
  • 每次操作后的 MySQL SUM 和 MIN

    考虑以下表结构 Quantity BaseValue Id 0 3 1 1 0 8 1 2 0 5 1 3 0 2 1 4 假设这是一张表 名为Transactions 有什么方法可以对此表进行选择查询 它将对表中的值进行求和Quantit
  • Glibc 字符串操作函数的算法复杂度

    我意识到 Glibc 源代码经过了极其优化 并且是手工编码的汇编 是否有任何文档分析了常用字符串操作函数的算法复杂性 Big O 例如strmcp strncmp etc 可能没有这方面的文档 因为它很简单 其复杂度为 O n strcmp
  • 删除...创建与更改

    当涉及到创建存储过程 视图 函数等时 对对象执行 DROP CREATE 或 ALTER 哪个更好 我见过许多 标准 文档声称要执行 DROP CREATE 但我也见过许多提倡使用 ALTER 方法的评论和争论 ALTER 方法保留了安全性
  • 如何设置 HttpURLConnection 的内容类型?

    你知道如何设置吗Content Type on HttpURL连接 http developer android com reference java net HttpURLConnection html 以下代码适用于 Blackberr
  • 范围或地图返回什么?

    Go 有非常简洁的多返回值范例 但看起来像v ok map key and v k range m使用具有相同符号的不同机制 这是一个简单的例子 func f2 k v string return Hello World func main