【问题标题】:Go : panic errors from BST and interface conversionGo:来自 BST 和接口转换的恐慌错误
【发布时间】:2013-11-10 01:28:11
【问题描述】:

http://play.golang.org/p/v1rp9-GN69

我遇到错误

   panic: interface conversion: interface is *main.Node, not *main.Player

从这一行

l := new_linked_list.GetLength()
for i:=0; i < l; i++ {
    fmt.Printf("Removing %v\n", new_linked_list.Pop().(*Player).name)
}

但它看起来对我来说是正确的,如果我将 (*Player) 更改为 (*Node),我会收到另一个错误。我应该如何修复此代码以及接口转换恐慌是什么意思?

http://play.golang.org/p/v1rp9-GN69

提前致谢。

【问题讨论】:

    标签: interface go binary-search-tree


    【解决方案1】:

    例如,

    package main
    
    import "fmt"
    
    type Node struct {
        value interface{}
        next  *Node
    }
    
    func NewNode(input_value interface{}, input_next *Node) *Node {
        return &Node{value: input_value, next: input_next}
    }
    
    func (A *Node) GetNext() *Node {
        if A == nil {
            return nil
        }
        return A.next
    }
    
    type LinkedList struct {
        head   *Node
        length int
    }
    
    func (A *LinkedList) GetLength() int {
        return A.length
    }
    
    func NewLinkedList() *LinkedList {
        return new(LinkedList)
    }
    
    func (A *LinkedList) Push(input_value interface{}) {
        A.head = NewNode(input_value, A.head)
        A.length++
    }
    
    func (A *LinkedList) Pop() interface{} {
        if A.head != nil {
            head_node := A.head
            A.head = A.head.GetNext()
            A.length--
            return head_node
        }
        return nil
    }
    
    func (A *LinkedList) eachNode(f func(*Node)) {
        for head_node := A.head; head_node != nil; head_node = head_node.GetNext() {
            f(head_node)
        }
    }
    
    func (A *LinkedList) TraverseL(f func(interface{})) {
        A.eachNode(func(input_node *Node) {
            f(input_node.value)
        })
    }
    
    func main() {
    
        type Player struct {
            name   string
            salary int
        }
    
        new_linked_list := NewLinkedList()
        new_linked_list.Push(&Player{name: "A", salary: 999999})
        new_linked_list.Push(&Player{name: "B", salary: 99999999})
        new_linked_list.Push(&Player{name: "C", salary: 1452})
        new_linked_list.Push(&Player{name: "D", salary: 312412})
        new_linked_list.Push(&Player{name: "E", salary: 214324})
        new_linked_list.Push(&Player{name: "EFFF", salary: 77528})
    
        fmt.Println(new_linked_list.Pop())
    
        new_linked_list.TraverseL(func(input_value interface{}) {
            //to tell the type of interface value
            if player, exist := input_value.(*Player); exist {
                fmt.Printf("\t%v: %v\n", player.name, player.salary)
            }
        })
    
        l := new_linked_list.GetLength()
        for i := 0; i < l; i++ {
            fmt.Printf("Removing %v\n", new_linked_list.Pop().(*Node).value.(*Player).name)
        }
    }
    

    输出:

    &{0xc0100371e0 0xc0100371c0}
        E: 214324
        D: 312412
        C: 1452
        B: 99999999
        A: 999999
    Removing E
    Removing D
    Removing C
    Removing B
    Removing A
    

    【讨论】:

    • 谢谢!我忘了指定类型!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-03
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多