
本文详解如何在go中正确统计切片中各整数元素的出现次数,解决因未初始化map导致的panic错误,并提供可读性强、符合go惯用法的完整解决方案。
本文详解如何在go中正确统计切片中各整数元素的出现次数,解决因未初始化map导致的panic错误,并提供可读性强、符合go惯用法的完整解决方案。
在Go语言中,使用map统计数组(切片)中元素频次是一个常见需求,但初学者常因忽略map的初始化而触发运行时panic:assignment to entry in nil map。根本原因在于:声明var dict map[int]int仅创建了一个nil map指针,而非实际可操作的哈希表——向nil map写入键值对会导致程序崩溃。
正确做法是使用内置函数make(map[K]V)显式初始化map。此外,频次统计的核心逻辑是:遍历每个元素,将dict[num]的当前值(若不存在则为0)加1。Go中map访问不存在的键会自动返回零值(int类型为0),因此dict[num] = dict[num] + 1安全且简洁。
以下是修正后的完整代码:
package main
import "fmt"
func main() {
inputArray := []int{10, 20, 30, 56, 67, 90, 10, 20}
printUniqueValue(inputArray)
}
func printUniqueValue(arr []int) {
dict := make(map[int]int) // ✅ 正确初始化map
for _, num := range arr {
dict[num]++ // 等价于 dict[num] = dict[num] + 1
}
fmt.Println(dict) // 输出: map[10:2 20:2 30:1 56:1 67:1 90:1]
}关键注意事项:
立即学习“go语言免费学习笔记(深入)”;
- ❌ 避免
var dict map[int]int(声明但不初始化); - ✅ 必须使用
dict := make(map[int]int)或dict := map[int]int{}; -
dict[num]++是Go中惯用的频次累加写法,简洁且高效; - 若需按特定顺序(如数值升序)输出结果,需额外对map的key进行排序,因为Go中map遍历顺序是随机的;
- 该方法时间复杂度为O(n),空间复杂度为O(k)(k为唯一元素个数),适用于大多数场景。
通过正确初始化map并利用Go的零值语义,即可稳健、高效地完成元素频次统计任务。


















