如何在Golang中比较结构数据和接口数据?

时间:2016-08-24 18:28:54

标签: go data-structures

我正在尝试在Golang中创建一个通用的二叉树。如何比较接口中的数据和代码中的输入数据?这是我想要做的一个例子。给我带来麻烦的比较就是这个

 } else if cur.data < data {

-

package DSAA

type TreeNode struct {
    data interface{}
    right *TreeNode
    left *TreeNode
}

type BinarySearchTree struct {
    root *TreeNode
}

func BSTCreate() *BinarySearchTree {
    return &BinarySearchTree{nil}
}

func (b *BinarySearchTree) Insert(cur TreeNode, data interface{}) *BinarySearchTree {
    if &cur == nil {
        cur := &TreeNode{data, nil, nil}
    } else if cur.data < data {
        b = b.Insert(*cur.left, data)
    } else {
        b = b.Insert(*cur.right, data)
    }
    return b
}

1 个答案:

答案 0 :(得分:4)

你有一些选择:
1-使用运行时类型开关:

package main

import (
    "fmt"
)

func main() {
    fmt.Println(Less(1, 2))       // true
    fmt.Println(Less("AB", "AC")) // true
}

func Less(a, b interface{}) bool {
    switch v := a.(type) {
    case int:
        w := b.(int)
        return v < w
    case string:
        w := b.(string)
        return v < w

    }
    return false
}

然后用{替换} else if cur.data < data { } else if Less(cur.data , data) {

2-使用Comparer interface

package main

import (
    "fmt"
)

type Comparer interface {
    // Less reports whether the element  is less than b
    Less(b interface{}) bool
}

func main() {
    a, b := Int(1), Int(2)
    fmt.Println(a.Less(b)) // true

    c, d := St("A"), St("B")
    fmt.Println(c.Less(d)) // true
}

type Int int

func (t Int) Less(b interface{}) bool {
    if v, ok := b.(Int); ok {
        return int(t) < int(v)
    }
    return false
}

type St string

func (t St) Less(b interface{}) bool {
    if v, ok := b.(St); ok {
        return string(t) < string(v)
    }
    return false
}

3-使用reflect