为了账号安全,请及时绑定邮箱和手机立即绑定

有没有办法指定进入 Go 列表的类型?

有没有办法指定进入 Go 列表的类型?

Go
一只甜甜圈 2022-10-31 17:20:49
有没有办法指定进入 Go 列表的类型?我是 Go 新手,我从 Google 搜索中看到的大部分内容都提到了切片,我什至想问这个问题。我坚持使用带有列表的代码,无法修改为切片。文档提到列表使用元素的接口。我问是因为我写了这段代码:a := list.New() a.PushBack(x)并从运行我的文件的代码中得到这个错误。panic: interface conversion: interface {} is int, not fileA.TypeA我的直觉是创建一个只接受fileA.TypeA但如果有其他方法可以解决此问题的建议。
查看完整描述

1 回答

?
胡说叔叔

TA贡献1804条经验 获得超8个赞

我猜当您从列表中读取数据时,您使用错误的类型来转换数据。


例如。


package main


import (

    "container/list"

    "fmt"

)


type User struct {

    name string

}


func main() {

    l := list.New()

    l.PushBack(User{name: "Jack"})

    l.PushBack(2)


    for e := l.Front(); e != nil; e = e.Next() {

        fmt.Println(e.Value.(int))

    }

}

// panic: interface conversion: interface {} is main.User, not int

列表有 User 和 int 两种类型,但是如果你只使用 int 来转换列表中的所有数据,它会抛出 panic 错误。您需要使用正确的类型进行转换。


然后你可以像下面的例子那样检测类型。


package main


import (

    "container/list"

    "fmt"

)


type User struct {

    name string

}


func do(i interface{}) {

    switch v := i.(type) {

    case int:

        fmt.Printf("This type is int: %d", v)

    case User:

        fmt.Printf("This is User type: %#v\n", v)

    default:

        fmt.Printf("I don't know about type %T!\n", v)

    }

}


func main() {

    l := list.New()

    l.PushBack(User{name: "Jack"})

    l.PushBack(2)

    l.PushBack(3)


    for e := l.Front(); e != nil; e = e.Next() {

        do(e.Value)

    }

}


查看完整回答
反对 回复 2022-10-31
  • 1 回答
  • 0 关注
  • 76 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信