Go 变异映射中不存在的键与数组中的相似键
我是golang的新手,这一部分的Go about之旅正在扼杀我的粉红小马世界 以下是问题的一个示例: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]) //
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”习惯用法允许比恐慌/恢复对更干净的错误处理。当然,我将使用这种方式,并尝试改变主意继续下去。=)