2015-07-19 139 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)) 
}