在我的测试中,我有一个函数可以从这样的结构中获取值:
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
。我该怎么做?
答案 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 上的完整代码)。