当前位置: 首页 > 面试题库 >

范围或地图返回什么?

柯乐童
2023-03-14
问题内容

Go具有非常整洁的多个返回值范例。但是它看起来v, ok := map[key]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"]v := m["One"]-两个表达式都正常工作而没有任何错误。为什么会有不同的行为?


问题答案:

在地图,数组或切片上map使用内建的获取range,并且还type assertions允许一个
两个变量。用户定义的函数和方法不是这种情况。如果一个函数声明了两个返回值,则必须告诉他们如何处理这两个返回值,或者忽略这两个值:

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

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

映射(索引表达式):

map [K] V类型的map a上的索引表达式可用于特殊形式的分配或初始化

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

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

范围(用于声明):

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

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

类型断言:

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

如果在类型
v 的赋值或初始化中使用类型声明,则ok = x。(T)
v,ok:= x。(T)
var v,ok = x。(T)
,声明的结果为一对类型(T,布尔值)的值



 类似资料:
  • 我有一个电子表格,由外部应用程序通过Google Sheets API编辑。然后,我在电子表格中有一个谷歌应用程序脚本函数,它由可安装的更改触发器调用。在开始时,此函数检查changeType是否等于“EDIT”,然后使用getActiveRange()检查编辑范围的最后一列。这很好,但有时返回的范围比实际编辑的范围小。功能代码: 例如,我们有一个空范围A3: G5。在这个范围内插入值后,它会正确

  • 范围图包括面积范围图、曲线面积范围图及柱形范围图,另外通过设置 chart.inverted 可将范围柱状图变成范围条形图。 范围图在使用时需要额外引入 highcharts-more.js <script src="http://cdn.hcharts.cn/highcharts/highcharts-more.js"></script> 图4-10 Highcharts 面积范围图 相关例子

  • 返回由边界值 a 和 b 限定范围内的 num 。 如果 num 在限定范围内,则返回 num 。 否则,返回范围内最接近的数字。 const clampNumber = (num, a, b) => Math.max(Math.min(num, Math.max(a, b)), Math.min(a, b)); clampNumber(2, 3, 5); // 3 clampNumber(1,

  • 问题内容: 我在将IP地址范围转换为CIDR块列表时遇到一些逻辑上的麻烦。我确实相信这个网站做对了:http : //ip2cidr.com/ 我想输入一个起始IP地址和一个结束IP地址,并让Java吐出CIDR块的最小列表,以仅覆盖传入的范围,仅此而已。 例如,如果我传入的起始地址为1.1.1.111,终止地址为1.1.1.120,则我希望得到回报:1.1.1.111/32 1.1.1.112/

  • 本文向大家介绍Android百度地图poi范围搜索,包括了Android百度地图poi范围搜索的使用技巧和注意事项,需要的朋友参考一下 我想大家可能都有过这样的经历:兜里揣着一张银行卡,在街上到处找自动取款机(ATM)。在这个场景中,ATM就是的兴趣点,我们想做的事情就是找到离自己较近的一些ATM然后取款,此时我们并不关心附近有哪些超市、酒吧,因为这些地方没办法取钱! 说了这么多,一方面是加深大家

  • 问题内容: 为什么使用lambda函数来获取值列表i = 4。在调用lambda期间,不存在封闭范围。函数f已经完成工作并返回了控制(变量i不存在)。 问题答案: Python使用闭包捕获对原始变量的引用。这些对象保留对名称的引用,可以通过该引用访问值。这意味着变量在完成后将继续存在。 您可以在lambda对象的元组中内省此闭包;函数具有相同的属性: 这也是列表中 所有 lambda 都引用val