Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 变异映射中不存在的键与数组中的相似键_Go - Fatal编程技术网

Go 变异映射中不存在的键与数组中的相似键

Go 变异映射中不存在的键与数组中的相似键,go,Go,我是golang的新手,这一部分的Go about之旅正在扼杀我的粉红小马世界 以下是问题的一个示例: package main import "fmt" func main() { a := make([]int, 10) fmt.Println(a[123]) //panic: runtime error: index out of range, good b := make(map[int]int, 10) fmt.Println(b[123]) //

我是golang的新手,这一部分的Go about之旅正在扼杀我的粉红小马世界

以下是问题的一个示例:

package main

import "fmt"

func main() {
    a := make([]int, 10)
    fmt.Println(a[123]) //panic: runtime error: index out of range, good

    b := make(map[int]int, 10)
    fmt.Println(b[123]) // 0 ? WHAAAT? Not nil, not panic?
}
我知道,我可以用第二个值检查元素的存在性,如下所示:

v, ok := b[11]
if (!ok) {
    // do something strange
}
但为什么每次在我需要从地图上得到东西的地方我都要这样做呢?我认为像联想数组一样的地图,但是这种行为很奇怪。
如何使用键的紧急级别检查创建映射?

确保映射中的零值不是由于键不存在而导致的唯一方法是“逗号,ok”习惯用法(
v,ok:=m[k]
)。如果需要对不存在的键进行紧急响应,最好的方法是编写一个helper函数

func mapSafe(m map[string]int, key string) (i int) {
    i, ok: = m[key]
    if (!ok) {
        panic("Key not in map")
    }
    return
}

确保映射中的零值不是由于键不存在而导致的唯一方法是“逗号,ok”习惯用法(
v,ok:=m[k]
)。如果需要对不存在的键进行紧急响应,最好的方法是编写一个helper函数

func mapSafe(m map[string]int, key string) (i int) {
    i, ok: = m[key]
    if (!ok) {
        panic("Key not in map")
    }
    return
}
我如何通过钥匙的紧急级别检查来制作地图

你不能

我如何通过钥匙的紧急级别检查来制作地图


你不能。

你不需要“考虑像关联数组那样的映射”,它们是散列映射,它们的行为是定义良好的。我相信这是一个常见问题……之所以“为什么”是因为有两个合理的选项,返回零值或引起恐慌,前者在实践中更有用(例如
m[k]++
即使
k
还没有出现在地图上也能工作)。Dave,是的,我认为这种行为可以用在某些逻辑中。但同时,我确信,它会在大量数据中产生看不见的错误。Go通常在正常的控制流中处理错误(
if err!=nil
,等等)。越界访问、零指针deref和类型断言失败是恐慌的怪现象。在某种程度上,这是因为这些错误倾向于指出程序逻辑的问题(例如,为数组上的循环设置一个错误的边界),而不仅仅是奇数输入(例如,输入JSON映射中缺少键)。其他设计也存在一些问题,可以避免恐慌(例如,想象一下通过访问
a[123]
,无意中增加一个切片的问题)。这并不是说Go客观地做了唯一正确的事情(我不喜欢这种说法)但它可能会为理解决策提供有用的上下文,甚至可能为如何更好地使用Go编写提供有用的上下文。你不需要“像关联数组一样考虑映射”,它们是散列映射,它们的行为是定义良好的。我相信这是某个地方的常见问题……之所以“为什么”只是因为有两个合理的选项,返回零值或引起恐慌,前者在实践中更有用(例如,
m[k]++
即使
k
还没有出现在地图上也有效)。Dave,是的,我认为,这种行为可以在某些逻辑中使用。但同时,我确信,它会在大量数据中产生看不见的错误。Go通常在正常的控制流中处理错误(
if err!=nil
,等等)。越界访问、零指针deref和类型断言失败是恐慌的怪现象。在某种程度上,这是因为这些错误倾向于指出程序逻辑的问题(例如,为数组上的循环设置一个错误的边界),而不仅仅是奇数输入(例如,输入JSON映射中缺少键)。其他设计也存在一些问题,可以避免恐慌(例如,想象一下通过访问
a[123]
,无意中增加一个切片的问题)。这并不是说Go客观地做了唯一正确的事情(我不喜欢这种说法)但它可能会为理解决策提供有用的上下文,甚至可能为如何更好地使用Go编写提供有用的上下文。我曾考虑过一些类似于此的函数,但从一个包到另一个包的转换角度来看,我感到很难过。不过,我不明白为什么您经常希望地图访问出现恐慌。“逗号,ok”习惯用法允许比恐慌/恢复对更干净的错误处理。当然,我将使用这种方式,并尝试改变主意继续下去。=)我考虑过一些类似的功能,但从一个包到另一个包的角度来看,我很难过。不过,我不明白为什么你经常希望地图访问出现恐慌。“逗号,ok”习惯用法允许比恐慌/恢复对更干净的错误处理。当然,我将使用这种方式,并尝试改变主意继续下去。=)