我正在写一个函数去删除字符串中的重复字符。这是我的方法。当我运行以下测试时,为什么会出现此错误?我是Go的新手,习惯了更多动态语言,比如Ruby / Python。
panic: assignment to entry in nil map [recovered]
panic: assignment to entry in nil map
source.go
func removeDuplicate(s string) string {
var m map[string]int
var c_string []string = strings.Split(s, "")
for i :=0; i < len(c_string); i++ {
m[c_string[i]] = 0
}
for i :=0; i < len(c_string); i++ {
m[c_string[i]] = m[c_string[i]] + 1
}
var (
result string = ""
)
for i :=0; i < len(c_string); i++ {
if m[c_string[i]] < 1 {
result = result + c_string[i]
}
}
return result
}
source_test.go
func TestRemoveDuplicateChars(t *testing.T) {
got := removeDuplicateChars("abbcde")
if got != "abcde" {
t.Fatalf("removeDuplicateChars fails")
}
}
答案 0 :(得分:6)
因为您还没有实际初始化/分配m
,所以您只是声明了它。做这个; var m map[string]int
m := map[string]int{}
。{/ p>
在同一声明中,哪个启动和分配。您还可以添加另一行m = make(map[string]int)
,这可以防止错误,但我个人更喜欢压缩语法。
m[c_string[i]] = 0
,将错误信息与上述信息相结合时,错误信息应该有意义。