Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 为什么我会得到;接口转换:接口为int32“;用于将列表整数元素转换为字符串?_List_Go - Fatal编程技术网

List 为什么我会得到;接口转换:接口为int32“;用于将列表整数元素转换为字符串?

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

新的去…我写了一个程序,以消除重复的整数存储在一个列表中。当我为RemovedUpplicates函数运行以下测试时,我得到了以下指向此行的错误:testString+=strconv.Itoa(e.Value.(int))in linked_test.go。这是为什么?我该如何修复它?我将整数存储在testList中,并使用e.Value获取它们,使用(int)进行类型转换

链接_测试。开始

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,要点很好。我对静态类型的语言是如此的陌生&我有时会抓住稻草,只是尽我所能加快学习速度