gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 02:00:25 26 4
gpt4 key购买 nike

我正在尝试创建一个函数,该函数将查看电梯结构列表(容器/列表类型)并返回指向具有正确 ip 地址的电梯的指针(该程序旨在控制电梯运行多台计算机)或零,如果这个地址没有电梯。

函数代码如下:

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.elevator

runtime.panic+0xac /home/fredrik/go/src/pkg/runtime/proc.c:1254
runtime.panic(0x4937a8, 0xf84002aaf0)
assertE2Tret+0x11d /home/fredrik/go/src/pkg/runtime/iface.c:312
assertE2Tret(0x4927f8, 0x45e6d8, 0xf8400004f0, 0x7fbae00c1ed8, 0x10, ...)
runtime.assertE2T+0x50 /home/fredrik/go/src/pkg/runtime/iface.c:292
runtime.assertE2T(0x4927f8, 0x45e6d8, 0xf8400004f0, 0x28)
main.(*ElevatorList).IPIsInList+0x5b /home/fredrik/Dropbox/Programmering/go/listtest/elevatorList.go:72
main.(*ElevatorList).IPIsInList(0xf8400001c8, 0x4a806c, 0x2e3332310000000f, 0x0, 0x0, ...)
main.main+0x1f3 /home/fredrik/Dropbox/Programmering/go/listtest/main.go:53
main.main()
runtime.mainstart+0xf /home/fredrik/go/src/pkg/runtime/amd64/asm.s:78
runtime.mainstart()
runtime.goexit /home/fredrik/go/src/pkg/runtime/proc.c:246
runtime.goexit()
----- goroutine created by -----
_rt0_amd64+0xc9 /home/fredrik/go/src/pkg/runtime/amd64/asm.s:65

这应该怎么做?我已经多次重写函数,我认为是 c.Value.(elevator) 和/或 c.Value.(*elevator) 的使用导致了问题.以下是 elevatorElevator_list 的结构:

type elevator struct {
Ip string
OrderList [FLOORS][3]int32
Floor int32
Dir int
Ms_since_ping int32
}

type ElevatorList struct {

Elevators *list.List

}

电梯被添加到带有函数的列表中

func (e *ElevatorList) AddToList(newElevator *elevator){
e.Elevators.PushBack(&newElevator)

}

最佳答案

显然 container/list 有效,但是“这应该如何完成?”的答案可能是“不要使用容器/列表,只使用普通 slice ”。这是一个替代版本:

package main

import "fmt"

const FLOORS = 6

type elevator struct {
Ip string
OrderList [FLOORS][3]int32
Floor int32
Dir int
Ms_since_ping int32
}

type ElevatorList []*elevator

func (list ElevatorList) IPIsInList(ip string) *elevator {
for _, e := range list {
if e.Ip == ip {
return e
}
}
return nil
}

func (list ElevatorList) PrintAll() {
fmt.Println(len(list), "items in list:")
for _, e := range list {
fmt.Println(" ", *e)
}
}

func main() {
var list ElevatorList
list = append(list, &elevator{Ip: "1.1.1.1"})
list = append(list, &elevator{Ip: "2.2.2.2"})
list.PrintAll()
list.PrintOne("1.1.1.1")
}

func (list ElevatorList) PrintOne(ip string) {
if e := list.IPIsInList(ip); e == nil {
fmt.Println(ip, "not found")
} else {
fmt.Println("found:", *e)
}
}

请注意,ElevatorList 不需要是结构体。我把AddToList方法彻底扔了。你甚至可能会折腾 IPIsInList。没有它,PrintOne 方法看起来并不复杂。

func (list ElevatorList) PrintOne(ip string) {
for _, e := range list {
if e.Ip == ip {
fmt.Println("found:", *e)
}
}
fmt.Println(ip, "not found")
}

关于list - 在 Go 中获取指向列表中结构的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9711223/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com