List 为什么我会得到;接口转换:接口为int32“;用于将列表整数元素转换为字符串?
新的去…我写了一个程序,以消除重复的整数存储在一个列表中。当我为RemovedUpplicates函数运行以下测试时,我得到了以下指向此行的错误:testString+=strconv.Itoa(e.Value.(int))in linked_test.go。这是为什么?我该如何修复它?我将整数存储在testList中,并使用e.Value获取它们,使用(int)进行类型转换 链接_测试。开始List 为什么我会得到;接口转换:接口为int32“;用于将列表整数元素转换为字符串?,list,go,List,Go,新的去…我写了一个程序,以消除重复的整数存储在一个列表中。当我为RemovedUpplicates函数运行以下测试时,我得到了以下指向此行的错误:testString+=strconv.Itoa(e.Value.(int))in linked_test.go。这是为什么?我该如何修复它?我将整数存储在testList中,并使用e.Value获取它们,使用(int)进行类型转换 链接_测试。开始 package linked import ( "container/list" "
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")
}
}
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
}
链接。转到
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")
}
}
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
}
rune
别名为int32
for _, c := range dupString {
newList.PushBack(c) // c is a rune aka int32
}
正在推送int32
s,而int
在64位CPU上被别名为int64
,因此一种方法是强制输入:
for _, c := range dupString {
newList.PushBack(int(c))
}
此外,像这样滥用整数的字符串表示是愚蠢的、缓慢的,并且不会起作用(例如,{123,12}-->“123”->{1,2,3})。如果您想要快速重复检测,您需要一个集合类型,在Go中通常意味着一个映射。例如,使用
var m map[int]bool,然后在循环中使用m[E.Value.(int)]=true,最后使用for v:=range m{newList.PushBack(v)}
。谢谢Dave,要点很好。我对静态类型的语言是如此的陌生&我有时会抓住稻草,只是尽我所能加快学习速度