本来想用go写一个自动将struct转成json字符串的工具,过程艰辛,屡屡碰壁,先记录一下利用反射reflect获取struct字段信息。
func GetFieldInfo(pObj interface{}){
t := reflect.TypeOf( pObj )
if t.Kind() == reflect.Ptr {
t = t.Elem()
}
if t.Kind() != reflect.Struct {
fmt.Println( "不是struct类型" )
}
var fName string
var fType string
var fTypeK reflect.Kind //其实用fType足够判断类型了,用Kind是个人喜好。
var fValue reflect.Value
for i := 0; i < t.NumField(); i++ {
v := reflect.ValueOf( pObj )
fName = t.Field( i ).Name
fType = t.Field( i ).Type.Name()
fValue = v.FieldByName( t.Field( i ).Name )
fTypeK = t.Field( i ).Type.Kind()
//此处可得到所有字段的基本信息
fmt.Printf( "%s %s %s\n",fName,fType,fValue )
//将reflect.Value类型的值转成属性原来的类型
switch fTypeK {
case reflect.Int:
fValue.Interface().( int )
case reflect.Float64:
fValue.Interface().( float64 )
case reflect.String:
fValue.Interface().( string )
case reflect.Struct:
fmt.Println( "结构" )
fValue.Interface().( 你要转的结构类型 )
case reflect.Slice:
fmt.Println( "切片" )
if strings.Contains( fType0,"." ) {
//struct数组,同case reflect.Struct(可遍历切片,使用递归得到每个struct信息)
}else{
//非struct数组,例如[]string
fValue.Interface().( []string )
}
//可通过添加case添加你想要处理的类型
default:
fmt.Println( "我是其他类型哦~" )
}
}
}
注意
reflect反射的只能是大写字母开头的属性,也就是public的,private不行。
假如属性名称是“_”开头的,也是不行的,会报下面的错: