2015-07-19 144 views
-1

新的去...我寫了一個程序來刪除存儲在列表中的重複整數。當我爲removeDuplicates函數運行以下測試時,出現以下指向此行的錯誤:testString + = strconv.Itoa(e.Value。(int)) in linked_test.go。爲什麼是這個,我該如何解決它?我將整數存儲在testList中,並使用e.Value和typosast以(int)來獲取它們。爲什麼我將「接口轉換:接口是int32」用於將列表整數元素轉換爲字符串?

panic: interface conversion: interface is int32, not int [recovered] 
    panic: interface conversion: interface is int32, not int 

linked_test.go

package linked 

import (
    "container/list" 
    "strconv" 
    "testing" 
) 

func TestDuplicates(t *testing.T) { 
    var (
     testList   = list.New() 
     exampleList  = list.New() 
     testString string = "" 
    ) 
    testList.PushBack(1) 
    testList.PushBack(2) 
    testList.PushBack(3) 
    testList.PushBack(2) 
    exampleList = removeDuplicates(testList) 
    for e := exampleList.Front(); e.Next() != nil; e = e.Next() { 
     testString += strconv.Itoa(e.Value.(int)) 
    } 
    if testString != "123" { 
     t.Fatalf("removeDuplicates failed") 
    } 
} 

linked.go

package linked 

import (
    "container/list" 
    "strconv" 
    "strings" 
) 

func removeDuplicates(l *list.List) *list.List { 
    var newList = list.New() 
    var dupString string = "" 
    for e := l.Front(); e.Next() != nil; e = e.Next() { 
     if strings.Index(dupString, strconv.Itoa(e.Value.(int))) == -1 { 
      dupString += strconv.Itoa(e.Value.(int)) 
     } 
    } 
    for _, c := range dupString { 
     newList.PushBack(c) 
    } 
    return newList 
} 
+2

除了[OneOfOne的答案](HTTP://計算器.com/a/31498076/55504),濫用像這樣的整數字符串表示是愚蠢的,緩慢的,並且不起作用(例如{123,12} - >「123」 - > {1,2,3})。如果你想要快速重複檢測,你需要一個在Go中通常意味着地圖的集合類型。例如。用'var m map [int] bool',然後在循環中用'm [e.Value。(int)] = true',最後用v:= range m {newList.PushBack(v)}' 。 –

+0

感謝戴夫,偉大的一點。我對靜態類型語言是如此的陌生,以至於我時不時地抓着稻草,只是想盡一切辦法來加速學習 – Nona

回答

1

rune是別名爲int32

for _, c := range dupString { 
    newList.PushBack(c) // c is a rune aka int32 
} 

是推動int32 s左右,而int化名爲int64在64位的CPU,這樣的一種方式來做到這一點是正義的力量類型:

for _, c := range dupString { 
    newList.PushBack(int(c)) 
}