2015-07-06 4 views
0

Я пишу функцию, чтобы удалить дубликаты символов в строке. Вот мой подход. Когда я запускаю следующий тест, почему я получаю эту ошибку? Я новичок в Go и привык к более динамичным языкам, таким как Ruby/Python.Почему я не могу ввести строку в Golang map?

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") 
    } 
} 

ответ

6

Потому что вы на самом деле не initilize/выделено m, вы только объявили его. Сделай это; var m map[string]int - m := map[string]int{}.

Что делает инициализацию и назначение как в том же самом заявлении. Вы также можете добавить еще одну строку m = make(map[string]int), которая предотвратила бы ошибку, хотя я лично предпочитаю сжатый синтаксис.

fyi ваш код работает на этой линии; m[c_string[i]] = 0, сообщение об ошибке должно иметь смысл при объединении с приведенной выше информацией.

Смежные вопросы