func twoSum(nums []int, target int) []int {
prevNums := map[int]int{}
for i, num := range nums {
targetNum := target - num
targetNumIndex, found := prevNums[targetNum]
if found {
return []int{targetNumIndex, i}
} else {
prevNums[num] = i
}
}
return []int{}
}
能解释一下targetNumIndex, found := prevNums[targetNum] 这一句话嘛。
在编译的类型检查期间,hash[key] 以及类似的操作都会被转换成哈希的 OINDEXMAP 操作,中间代码生成阶段会在 cmd/compile/internal/gc.walkexpr 函数中将这些 OINDEXMAP 操作转换成如下的代码:v := hash[key] // => v := *mapaccess1(maptype, hash, &key) v, ok := hash[key] // => v, ok := mapaccess2(maptype, hash, &key)
当接受一个参数时,会使用 runtime.mapaccess1,该函数仅会返回一个指向目标值的指针; 当接受两个参数时,会使用 runtime.mapaccess2,除了返回目标值之外,它还会返回一个用于表示当前键对应的值是否存在的 bool 值:
使用v,ok:=hash[k]比较好,这样能通过布尔值准确知道v==nil时,v到底是存储的元素还是表示该键对应的元素不存在