Go - How can I compare struct data and interface data in Golang

De openkb
Aller à : Navigation, rechercher

Sommaire

Questions

I am trying to create a generic Binary Tree in Golang. How can I compare data from an interface and input data in the code? Here is an example of what I am trying to do. The comparison that is giving me trouble is this

 } 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
}

Answers

You have some options:
1- Using runtime type switch:

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
}

then replace } else if cur.data < data { with } else if Less(cur.data , data) {


2- Using 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- Using reflect

Source

License : cc by-sa 3.0

http://stackoverflow.com/questions/39130593/how-can-i-compare-struct-data-and-interface-data-in-golang

Related

Outils personnels
Espaces de noms

Variantes
Actions
Navigation
Outils