GoLang二叉树-使用接口和结构

GoLang二叉树-使用接口和结构,go,Go,我试图使用GoLang中的接口和结构来创建一个二叉树概念 我写了下面的代码 package main import "fmt" type node interface { add(a int) getval() int } type node_element struct { element int left *node right *node } func (c *node_element) add(a int) { c.elemen

我试图使用GoLang中的接口和结构来创建一个二叉树概念

我写了下面的代码

package main

import "fmt"

type node interface {
    add(a int)
    getval() int
}

type node_element struct {
    element int

    left  *node
    right *node
}

func (c *node_element) add(a int) {
    c.element = a
}

func (c *node_element) getval() int {
    return c.element
}

func main() {

    var s node

    s = &node_element{}

    s.add(1)

    fmt.Println(s.getval())

}
现在我如何实例化左和右。我正在使用VIM和Go autocomplete。在按下时自动完成。没有清单。这意味着无法访问指向s的指针对象

如何实例化和使用left和right?

您不需要将s声明为节点,一个*node\u元素可以用作节点。您也永远不希望有指向接口的指针,因此将left和right类型更改为node

然后,您可以直接分配字段:

s := &node_element{}
s.add(1)
s.left = &node_element{element: 2}
s.right = &node_element{element: 3}

通读以快速了解语言和编程风格如果我继续在这个程序中使用它来制作一个二叉树程序,只是想了解我如何知道s.left元素是否已经声明?@tahseenjamal:将其与nil进行比较。如果我现在尝试打印s.left.element,它会给我错误,为什么?left是一个节点,不是节点元素。如果你想这么做,你需要一个类型断言。明白了。现在是最后一件事。我想展示二叉树。这意味着在getval中要返回一个显示左和右的字符串,但在第一次初始化中,左和右是nil,因此返回{+strconv.Itoac.left.*node_element.element+。+strconv.Itoac.element+。+strconv.Itoac.right.*node_element.element+}将nil转换为字符串时失败