如何在Golang

时间:2018-07-25 13:40:02

标签: go struct reflection compare

我正在尝试将这两个接口作为函数进行比较。就我而言,它正在工作。我在A接口{}和B中的map [string] interface {}发送了一个结构,它们的值相同,但是当与反射比较时,它们的结果并不相同。我希望能够在此函数内部将map [string] interface {}转换为struct接口,以便我的测试可以缩短。我尝试使用https://github.com/mitchellh/copystructure,但在此函数内部无法正常工作。(尽管从外部可以正常工作

var m map[string]interface{}
var something StructType
err := mapstructure.Decode(m, &something)

如果出错... 然后我在B接口中发送内容)

下面的

是比较接口的功能。您可以复制并粘贴并查看它如何工作

package main

import (
    "log"
    "reflect"
)

type Something struct {
    Name string
    Age  int
    Male bool
    Cars []string
}

func main() {
    var s Something
    s.Name = "joe"
    s.Male = true
    s.Age = 20
    s.Cars = []string{"Fordd", "Chevy", "Mazda"}
    m := make(map[string]interface{})
    m["Name"] = "joe"
    m["Male"] = true
    m["Age"] = 20
    m["Cars"] = []string{"Fordd", "Chevy", "Mazda"}
    //with map[string]interface{} although the same values it does not work
    log.Println("Are these the same: ", CompareData(s, m))
    //with struct of same type it works
    var s2 Something
    s2.Name = "joe"
    s2.Male = true
    s2.Age = 20
    s2.Cars = []string{"Fordd", "Chevy", "Mazda"}
    log.Println("Are these the same: ", CompareData(s, s2))

    }

func CompareData(A interface{}, B interface{}) bool {
    a := reflect.ValueOf(A)
    b := reflect.ValueOf(B)
    akind := a.Kind().String()
    bkind := a.Kind().String()
    if akind == "slice" && bkind == "slice" {
        for i := 0; i < a.Len(); i++ {
            // log.Println("they are sliced")
            CompareData(a.Index(i).Interface(), b.Index(i).Interface())
            // log.Println("\n", a.Index(i).Interface(), "\n", b.Index(i).Interface())
        }
        // t.Fatal("this is a slice you need to iterate over the values")
    } else {
        // log.Println("\n\n", A, "\n", B)
        if !reflect.DeepEqual(a.Interface(), b.Interface()) {
            log.Println("These should be equal\nSuccessData:\t", a.Interface(), "\nData:\t\t", b.Interface())
            return false
        }
        // log.Println("\nA:\t", A, "\nB:\t", B)
    }
    return true
}

0 个答案:

没有答案