0

I'm picking up Golang and I've got a problem in traversing a linked list. What I intend to do is visit all nodes of the linked list, and call an interface method from each node.

I've defined an interface

type Sortable interface {
    CompareTo(t Sortable) int
}

I've defined a node type and a linked list

type node struct {
    pNext *node
    value int
}

type LinkedList struct {
    PHead, PNode *node
}

func (n node) CompreTo(t Sortable) int{
    other := t.(node)
    if n.value == other.value {
        return 0
    } else if n.value > other.value {
        return 1
    } else {
        return -1
    }
}

The problem occurs when I'm doing a comparison while traversing the linked list: ......

PNode.CompareTo(PNode.pNext)

and I get: panic: interface conversion: Sortable is *node, not node

Guess this is because PNode and PNode.pNext are pointers to the node struct, not node objects? Then how should I cast the pointer to make it right? I used to write in C++ so maybe my strategy goes wrong in Golang world?

Any advice is appreciated!

1 Answer 1

1

You have to assert the Sortable t to a pointer node.

func (n node) CompreTo(t Sortable) int{
    other := t.(*node)
    if n.value == other.value {
        return 0
    } else if n.value > other.value {
        return 1
    } else {
        return -1
    }
}
Sign up to request clarification or add additional context in comments.

1 Comment

It is really unobvious that even though CompareTo is declared on node, but that makes Sortable a pointer to node, not node. Which part of the language spec talks about this?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.