使用`time.Time`进行类型切换

时间:2017-12-10 13:37:07

标签: unit-testing go reflection

在我的测试中,我有一个函数可以从这样的结构中获取值:

func getField(v interface{}, field string) string {
    r := reflect.ValueOf(v)
    f := reflect.Indirect(r).FieldByName(field)
    t := f.Kind()

    switch t {
    case reflect.Int, reflect.Int64:
        return strconv.FormatInt(f.Int(), 10)
    case reflect.String:
        return f.String()
    case reflect.Bool:
        if f.Bool() {
            return "true"
        }
        return "false"
    return ""
}

这适用于上述类型,但我无法让它适用于time.Time。我该怎么做?

3 个答案:

答案 0 :(得分:3)

从你想要做的事情来看,你在获得这个领域后并不需要反思。这是一个与time.Time一起使用的示例。

package main

import (
    "fmt"
    "reflect"
    "strconv"
    "time"
)

func getField(v interface{}, field string) string {
    r := reflect.ValueOf(v)
    f := reflect.Indirect(r).FieldByName(field)
    fieldValue := f.Interface()

    switch v := fieldValue.(type) {
    case int64:
        return strconv.FormatInt(v, 10)
    case int32:
        return strconv.FormatInt(int64(v), 10)
    case int:
        return strconv.FormatInt(int64(v), 10)
    case string:
        return v
    case bool:
        if v {
            return "true"
        }
        return "false"
    case time.Time:
        return v.String()
    default:
        return ""
    }
}

type MyStruct struct {
    Name   string
    Number int32
    Is     bool
    Clock  time.Time
}

func main() {
    s := MyStruct{}
    fmt.Println(getField(s, "Name"))
    fmt.Println(getField(s, "Number"))
    fmt.Println(getField(s, "Is"))
    fmt.Println(getField(s, "Clock"))
}

答案 1 :(得分:0)

仅提供替代解决方案,您始终可以将种类保留为 var ,并在情况下使用它们。

var timeKind = reflect.TypeOf(time.Time{}).Kind()

func getField(v interface{}, field string) string {
    r := reflect.ValueOf(v)
    f := reflect.Indirect(r).FieldByName(field)
    t := f.Kind()

    switch t {
    case reflect.Int, reflect.Int64:
        return strconv.FormatInt(f.Int(), 10)
    case reflect.String:
        return f.String()
    case reflect.Bool:
        if f.Bool() {
            return "true"
        }
        return "false"
    case timeKind: // i am here!!!
       // do whatever you want
    return ""
}

答案 2 :(得分:0)

这是一个测试 reflect.Value 是否代表 time.Time 对象的函数:

func isTime(obj reflect.Value) bool {
    _, ok := obj.Interface().(time.Time)
    return ok
}

Go Playground 上的完整代码)。