使用 反映 包:
包反映实现运行时反射,允许程序 操纵任意类型的对象。典型的用途是采取 使用静态类型接口{}的值并提取其动态类型 通过调用TypeOf返回一个Type的信息。
package main import ( "fmt" "reflect" ) func main() { b := true s := "" n := 1 f := 1.0 a := []string{"foo", "bar", "baz"} fmt.Println(reflect.TypeOf(b)) fmt.Println(reflect.TypeOf(s)) fmt.Println(reflect.TypeOf(n)) fmt.Println(reflect.TypeOf(f)) fmt.Println(reflect.TypeOf(a)) }
生产:
bool string int float64 []string
操场
使用示例 ValueOf(i interface{}).Kind() :
ValueOf(i interface{}).Kind()
package main import ( "fmt" "reflect" ) func main() { b := true s := "" n := 1 f := 1.0 a := []string{"foo", "bar", "baz"} fmt.Println(reflect.ValueOf(b).Kind()) fmt.Println(reflect.ValueOf(s).Kind()) fmt.Println(reflect.ValueOf(n).Kind()) fmt.Println(reflect.ValueOf(f).Kind()) fmt.Println(reflect.ValueOf(a).Index(0).Kind()) // For slices and strings }
bool string int float64 string
我会远离反思。包。而是使用%T
package main import ( "fmt" ) func main() { b := true s := "" n := 1 f := 1.0 a := []string{"foo", "bar", "baz"} fmt.Printf("%T\n", b) fmt.Printf("%T\n", s) fmt.Printf("%T\n", n) fmt.Printf("%T\n", f) fmt.Printf("%T\n", a) }
简而言之,请使用 fmt.Printf("%T", var1) 或其在fmt包中的其他变体。
fmt.Printf("%T", var1)
获取struct中的字段类型
package main import ( "fmt" "reflect" ) type testObject struct { Name string Age int Height float64 } func main() { tstObj := testObject{Name: "yog prakash", Age: 24, Height: 5.6} val := reflect.ValueOf(&tstObj).Elem() typeOfTstObj := val.Type() for i := 0; i < val.NumField(); i++ { fieldType := val.Field(i) fmt.Printf("object field %d key=%s value=%v type=%s \n", i, typeOfTstObj.Field(i).Name, fieldType.Interface(), fieldType.Type()) } }
产量
object field 0 key=Name value=yog prakash type=string object field 1 key=Age value=24 type=int object field 2 key=Height value=5.6 type=float64
请参阅IDE https://play.golang.org/p/bwIpYnBQiE
我找到了3种在运行时识别类型的方法:
的 运用 字符串格式 强>
func typeof(v interface{}) string { return fmt.Sprintf("%T", v) }
的 运用 反映包裹 强>
func typeof(v interface{}) string { return reflect.TypeOf(v).String() }
的 运用 类型断言 强>
func typeof(v interface{}) string { switch v.(type) { case int: return "int" case float64: return "float64" //... etc default: return "unknown" } }
每种方法都有不同的最佳用例:
字符串格式 - 短和低占用空间(不需要导入反映包)
反映包 - 当需要更多有关我们可以访问全反射功能的类型的详细信息时
type assertions - 允许分组类型,例如将所有int32,int64,uint32,uint64类型识别为“int”
反映 包来抢救:
reflect.TypeOf(obj).String()
检查一下 演示
您可以使用 reflect.TypeOf 。
reflect.TypeOf
int
string
<package name>.<struct name>
main.test
获取字符串表示:
从 http://golang.org/pkg/fmt/
%T是值类型的Go语法表示
package main import "fmt" func main(){ types := []interface{} {"a",6,6.0,true} for _,v := range types{ fmt.Printf("%T\n",v) } }
输出:
string int float64 bool
您可以使用“reflect”包在运行时检查任何变量/实例的类型 TypeOf 功能或使用 fmt.Printf() :
TypeOf
fmt.Printf()
package main import ( "fmt" "reflect" ) func main() { value1 := "Have a Good Day" value2 := 50 value3 := 50.78 fmt.Println(reflect.TypeOf(value1 )) fmt.Println(reflect.TypeOf(value2)) fmt.Println(reflect.TypeOf(value3)) fmt.Printf("%T",value1) fmt.Printf("%T",value2) fmt.Printf("%T",value3) }
您可以使用fmt包fmt.Printf()方法,更多信息: https://golang.org/pkg/fmt/
例: https://play.golang.org/p/aJG5MOxjBJD