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

在Go中获取指向列表中的结构的指针

在Go中获取指向列表中的结构的指针

Go
RISEBY 2021-04-27 16:53:04
我正在尝试制作一个函数,该函数将查看电梯结构的列表(类型容器/列表),并返回指向具有正确ip地址的电梯的指针(该程序用于控制多台计算机上的电梯)如果没有使用此地址的电梯,则为nil。这是功能代码:func (e *ElevatorList)IPIsInList(ip string) *elevator{    for c := e.Elevators.Front(); c != nil; c = c.Next(){        if(c.Value.(elevator).Ip == ip){                return c.Value.(*elevator)        }    }    return nil}我认为在第一个返回行中进行强制转换看起来有点麻烦,但这是少数没有引起编译器错误的实现之一。当我运行程序时,我首先从其他函数获得输出,而当IPIsInList()调用该函数时,我得到以下信息:panic: interface conversion: interface is **main.elevator, not main.elevatorruntime.panic+0xac /home/fredrik/go/src/pkg/runtime/proc.c:1254runtime.panic(0x4937a8, 0xf84002aaf0)assertE2Tret+0x11d /home/fredrik/go/src/pkg/runtime/iface.c:312assertE2Tret(0x4927f8, 0x45e6d8, 0xf8400004f0, 0x7fbae00c1ed8, 0x10, ...)runtime.assertE2T+0x50 /home/fredrik/go/src/pkg/runtime/iface.c:292runtime.assertE2T(0x4927f8, 0x45e6d8, 0xf8400004f0, 0x28)main.(*ElevatorList).IPIsInList+0x5b /home/fredrik/Dropbox/Programmering/go/listtest/elevatorList.go:72main.(*ElevatorList).IPIsInList(0xf8400001c8, 0x4a806c, 0x2e3332310000000f, 0x0, 0x0, ...)main.main+0x1f3 /home/fredrik/Dropbox/Programmering/go/listtest/main.go:53main.main()runtime.mainstart+0xf /home/fredrik/go/src/pkg/runtime/amd64/asm.s:78runtime.mainstart()runtime.goexit /home/fredrik/go/src/pkg/runtime/proc.c:246runtime.goexit()----- goroutine created by -----_rt0_amd64+0xc9 /home/fredrik/go/src/pkg/runtime/amd64/asm.s:65应该怎么做?我已经多次重写了该函数,并且我认为这是导致问题的原因c.Value.(elevator)和/或c.Value.(*elevator)原因。以下是对结构elevator和Elevator_list:type elevator struct {Ip stringOrderList [FLOORS][3]int32Floor int32Dir intMs_since_ping int32}type ElevatorList struct {Elevators *list.List}该elevators的增加与功能列表func (e *ElevatorList) AddToList(newElevator *elevator){e.Elevators.PushBack(&newElevator)}
查看完整描述

3 回答

?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

在添加函数中,您将使用*电梯并获取指针的地址,然后再将其放入列表中。在检索函数中,您断言该类型是两次电梯。一次在if语句中,一次在返回中。他们两个都不同意真实的类型( *电梯)。您的if语句是第一个语句,因此它会慌张地解释该变量是**电梯,而不是电梯:


panic: interface conversion: interface is **main.elevator, not main.elevator

我会做两件事。首先,在列表中添加*电梯,而不是*电梯:


func (e *ElevatorList) AddToList(newElevator *elevator){

    e.Elevators.PushBack(newElevator)

}

接下来,我将更改if语句,以便对* elevator而不是电梯进行类型声明:


if(*(c.Value.(*elevator)).Ip == ip){


查看完整回答
反对 回复 2021-05-10
  • 3 回答
  • 0 关注
  • 180 浏览
慕课专栏
更多

添加回答

举报

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