package mainimport"fmt"//interface{}是万能数据类型funcmyFunc(arg interface{}){fmt.Println("myFunc is called...")fmt.Println(arg)//interface{} 改如何区分 此时引用的底层数据类型到底是什么?//给 interface{} 提供 “类型断言” 的机制value, ok := arg.(string)if!ok {fmt.Println("arg is not string type")}else{fmt.Println("arg is string type, value = ", value)fmt.Printf("value type is %T\n", value)}}type Book struct{auth string}funcmain(){book := Book{"Golang"}myFunc(book)myFunc(100)myFunc("abc")myFunc(3.14)}
五、反射reflect用法机制
5.1 基本用法
package mainimport("fmt""reflect")funcreflectNum(arg interface{}){// 定义一个空接口fmt.Println("type:",reflect.TypeOf(arg))// 获取接口里的数据类型fmt.Println("value:",reflect.ValueOf(arg))// 获取接口里的值}funcmain(){var num float64=1.2345reflectNum(num)}
5.2 深层次用法
package mainimport("fmt""reflect")type User struct{Id intName stringAge int}func(this User)Call(){fmt.Println("user is called..")fmt.Printf("%v\n", this)}funcdoFiledMethod(input interface{}){// 获取input的typeinputType := reflect.TypeOf(input)fmt.Println("inputType is :", inputType.Name())// 获取input的valueinputValue := reflect.ValueOf(input)fmt.Println("inputValue is :", inputValue)// 通过Type获取input里面的字段// 1.获取interface的reflect.Type,通过Type得到NumFiled,进行遍历// 2.得到每个field,数据类型// 3. 通过field有一个Interface()方法得到对应的valuefor i :=0; i < inputType.NumField(); i++{field := inputType.Field(i)// 获取字段value := inputValue.Field(i).Interface()// 获取字段对应的值fmt.Printf("%s:%v = %v\n", field.Name, field.Type, value)}// 通过type获取input里面的方法for i :=0; i < inputType.NumMethod(); i++{m := inputType.Method(i)fmt.Printf("%s: %v\n", m.Name, m.Type)}}funcmain(){user := User{1,"Aceld",18}doFiledMethod(user)}
六、反射机制解析结构体标签tag
package mainimport("fmt""reflect")type resume struct{Name string`info:"name" doc:"我的名字"`Sex string`info:"sex"`}funcfindTag(str interface{}){t := reflect.TypeOf(str).Elem()for i :=0; i < t.NumField(); i++{taginfo := t.Field(i).Tag.Get("info")tagdoc := t.Field(i).Tag.Get("doc")fmt.Println("info: ", taginfo," doc: ", tagdoc)}}funcmain(){var re resumefindTag(&re)}