用time.Time去类型开关

fis*_*ben 0 reflection unit-testing go

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

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 ""
}
Run Code Online (Sandbox Code Playgroud)

这适用于上面的类型,但我无法使用它time.Time。我该怎么做呢?

Arm*_*ani 5

从您要尝试做的事情来看,获得该领域之后,您实际上并不需要反思。这也是一个示例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"))
}
Run Code Online (Sandbox Code Playgroud)