1

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

前もって感謝します。

4

1 に答える 1

0

例えば、

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
于 2013-11-10T02:43:16.160 に答える