go的反射機(jī)制是要通過接口來進(jìn)行的,而類似于Java的Object的空接口可以和任何類型進(jìn)行交互,因此對(duì)基本數(shù)據(jù)類型等的反射也直接利用了這一特點(diǎn)。
創(chuàng)新互聯(lián)公司是一家專注網(wǎng)站建設(shè)、網(wǎng)絡(luò)營銷策劃、小程序設(shè)計(jì)、電子商務(wù)建設(shè)、網(wǎng)絡(luò)推廣、移動(dòng)互聯(lián)開發(fā)、研究、服務(wù)為一體的技術(shù)型公司。公司成立10余年以來,已經(jīng)為成百上千小攪拌車各業(yè)的企業(yè)公司提供互聯(lián)網(wǎng)服務(wù)?,F(xiàn)在,服務(wù)的成百上千客戶與我們一路同行,見證我們的成長;未來,我們一起分享成功的喜悅。package main
import (
"fmt"
"reflect"
)
type Student struct {
Name string
Age int
Sex uint // 0-女性,1-男性
Address string
}
func (stu Student) Print() {
sex := "女"
if stu.Sex == 1 {
sex = "男"
}
fmt.Printf("姓名:%s,年齡:%d,性別:%s,地址:%s", stu.Name, stu.Age, sex, stu.Address)
}
func (stu Student) Say(content string) string{
return fmt.Sprintf("%s說:%s", stu.Name, content)
}
func main() {
// ============================================================操作基本數(shù)據(jù)類型
var a1 int = 1
var a2 string = "中國"
var a3 = [...]byte{1, 2, 3} // 數(shù)組
var a4 = []int{5, 6, 7} // 切片
var a5 = map[string]int{"china":1, "usa":2} // Map
// 轉(zhuǎn)化成reflect對(duì)象,reflect.Type和reflect.Value
// TypeOf()返回的數(shù)據(jù)類型是*reflect.rtype,ValueOf()返回的數(shù)據(jù)類型是reflect.Value
t1 := reflect.TypeOf(a1); v1 := reflect.ValueOf(a1)
t2 := reflect.TypeOf(a2); v2 := reflect.ValueOf(a2)
t3 := reflect.TypeOf(a3); v3 := reflect.ValueOf(a3)
t4 := reflect.TypeOf(a3); v4 := reflect.ValueOf(a4)
t5 := reflect.TypeOf(a3); v5 := reflect.ValueOf(a5)
fmt.Println("a1====", t1, v1)
fmt.Println("a2====", t2, v2)
fmt.Println("a3====", t3, v3)
fmt.Println("a4====", t4, v4)
fmt.Println("a5====", t5, v5)
fmt.Println()
// 取值
fmt.Println("a1的值:", v1.Int())
fmt.Println("a2的值:", v2.String())
fmt.Println("a3中下標(biāo)為1的元素的值:", v3.Index(1))
fmt.Println("a4中下標(biāo)為1的元素的值:", v4.Index(1))
fmt.Println("a4中取[1,3)的子切片:", v4.Slice(1, 3))
fmt.Println("a5中所有key:", v5.MapKeys())
fmt.Print("遍歷a5中的value:")
for _, key := range v5.MapKeys() {
fmt.Print(key, "====", v5.MapIndex(key), "\t")
}
fmt.Println()
fmt.Println()
// 獲取類型
fmt.Println("a1的類型:", v1.Type())
fmt.Println("a2的類型:", v2.Type())
fmt.Println("a3的類型:", v3.Type())
fmt.Println("a4的類型:", v4.Type())
fmt.Println("a5的類型:", v5.Type())
fmt.Println()
// Kind類型判斷,Kind()
fmt.Println("a1的類型是否為int:", v1.Kind() == reflect.Int)
fmt.Println("a2的類型是否為string:", v2.Kind() == reflect.String)
fmt.Println("a3的類型是否為array:", v3.Kind() == reflect.Array)
fmt.Println("a4的類型是否為slice:", v4.Kind() == reflect.Slice)
fmt.Println("a5的類型是否為map:", v5.Kind() == reflect.Map)
fmt.Println()
// 接口類型變量,Interface是獲取該value的值,返回的是一個(gè)interface對(duì)象
fmt.Printf("a1====%T\t%v\n", v1.Interface(), v1.Interface())
fmt.Printf("a2====%T\t%v\n", v2.Interface(), v2.Interface())
fmt.Printf("a3====%T\t%v\n", v3.Interface(), v3.Interface())
fmt.Printf("a4====%T\t%v\n", v4.Interface(), v4.Interface())
fmt.Printf("a5====%T\t%v\n", v5.Interface(), v5.Interface())
fmt.Println()
// 判斷是否可以修改
fmt.Println("a1通過反射是否可以進(jìn)行修改:", v1.CanSet())
fmt.Println("a2通過反射是否可以進(jìn)行修改:", v2.CanSet())
fmt.Println("a3通過反射是否可以進(jìn)行修改:", v3.CanSet())
fmt.Println("a4通過反射是否可以進(jìn)行修改:", v4.CanSet())
fmt.Println("a5通過反射是否可以進(jìn)行修改:", v5.CanSet())
fmt.Println()
// 修改,必須傳指針,且調(diào)用Elem()
vv1 := reflect.ValueOf(&a1).Elem()
fmt.Printf("vv1的類型:%T,a1現(xiàn)在是否可以通過:%v\n", vv1, vv1.CanSet())
vv2 := reflect.ValueOf(&a2).Elem()
vv3 := reflect.ValueOf(&a3).Elem()
vv4 := reflect.ValueOf(&a4).Elem()
vv5 := reflect.ValueOf(&a5).Elem()
vv1.SetInt(100) // 修改
vv2.SetString("美國")
var temp byte = 90
vv3.Index(0).Set(reflect.ValueOf(temp)) // 必須傳reflect.Value類型
vv4.Index(0).SetInt(900)
// 必須傳reflect.Value類型
vv5.SetMapIndex(reflect.ValueOf("china"), reflect.ValueOf(111))
fmt.Println("a1修改后的值:", a1)
fmt.Println("a2修改后的值:", a2)
fmt.Println("a3修改后的值:", a3)
fmt.Println("a4修改后的值:", a4)
fmt.Println("a5修改后的值:", a5)
// ============================================================操作結(jié)構(gòu)體
stu := Student{"李四", 18, 1, "中國北京市天安門10000號(hào)"}
// 轉(zhuǎn)化成reflect對(duì)象,reflect.Type和reflect.Value
st1 := reflect.TypeOf(stu)
sv1 := reflect.ValueOf(stu)
fmt.Println(st1, "====", sv1)
// 獲取結(jié)構(gòu)體名稱
fmt.Println(st1.Name())
// 判斷Kind類型
fmt.Println(st1.Kind() == reflect.Struct)
// 獲取結(jié)構(gòu)體中字段數(shù)量
fmt.Println(st1.NumField())
// 獲取結(jié)構(gòu)體中每個(gè)字段的值
for i := 0 ; i < st1.NumField() ; i++ {
fieldName := st1.Field(i).Name // 取字段名
fieldType := st1.Field(i).Type
fieldVal := sv1.Field(i).Interface() // 取值
fmt.Printf("字段名:%v,類型:%v,值:%v\n", fieldName, fieldType, fieldVal)
}
// 獲取結(jié)構(gòu)體的方法數(shù)量
fmt.Println(st1.NumMethod())
// 遍歷所有方法的名稱和類型
for i := 0 ; i < st1.NumMethod() ; i++ {
method := st1.Method(i)
fmt.Println(method.Name, "====", method.Type)
}
// 通過反射執(zhí)行方法
m1 := sv1.MethodByName("Print")
m1.Call(nil)// 不帶參數(shù)和返回值
fmt.Println()
m2 := sv1.MethodByName("Say")
params := []reflect.Value{reflect.ValueOf("你好啊!")}
res := m2.Call(params) // 帶參數(shù)和返回值,參數(shù)是reflect.Value的切片,返回值也一樣
fmt.Println(res[0].String())
}
創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務(wù)器,動(dòng)態(tài)BGP最優(yōu)骨干路由自動(dòng)選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動(dòng)現(xiàn)已開啟,新人活動(dòng)云服務(wù)器買多久送多久。