2016-08-24 105 views
1

我想在Golang中創建一個通用的二叉樹。我怎樣才能比較來自接口的數據和代碼中的輸入數據?這是我正在嘗試做的一個例子。是給我找麻煩的比較是這樣的如何比較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 
} 
+0

什麼是你的數據,在運行時? – 2016-08-24 18:35:41

+0

在使用reflect.TypeOf() – Sridhar

+0

之前,檢查運行時類型是否相同。我計劃它是一個字符串或整數。類似於你可以在java和.compareTo中使用() – bmacrevolution

回答

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

+0

得到一些啓發你能否給我一個關於如何在這種情況下使用Less的簡單例子? – bmacrevolution

+0

這工作表示感謝! – bmacrevolution

+0

@bmacrevolution不用客氣。 – 2016-08-24 18:58:56