golang 反射和利用反射取結構體值


package main import ( "fmt"
    "reflect" ) type Reflect struct { Name string `json:"name" test:"tag"` PassWord string Three int } func (m Reflect)Hello(v int) { fmt.Println("hello",v) } func (m Reflect)World() { fmt.Printf("world") } func main() { //st:=reflect.DeepEqual()
    s:=Reflect{"name","password",0} //類型
    ty:=reflect.TypeOf(s) //
    va:=reflect.ValueOf(s) //kind判斷類型
    if ty.Kind()!=reflect.Struct{ fmt.Println("error not struct") } //type 相關的操作 //結構體名字
 fmt.Println(ty.Name()) //字段數
 fmt.Println(ty.NumField()) for i:=0;i<ty.NumField();i++{ //獲取字段具體的值
        value:=va.Field(i).Interface() //獲取單個字段
        filed:=ty.Field(i) //filed.Tag可以獲取tag,通過tag進行參數的校驗
        fmt.Printf("第%d 個字段是%s,%s ,值為%v \n",i,filed.Name,filed.Type,value) //打印后面的tag標簽
 fmt.Println(filed.Tag) } //獲取方法相關
 fmt.Println(ty.NumMethod()) for i:=0;i<ty.NumMethod();i++{ //方法名字和類型
        method:=ty.Method(i) fmt.Printf("方法名:%s 類型:%v\n",method.Name,method.Type) } //通過反射修改內容,必須取出地址
    add:=&Reflect{"name","password",0} v:=reflect.ValueOf(add) // 修改值必須是指針類型否則不可行
    if v.Kind() != reflect.Ptr { fmt.Println("不是指針類型,沒法進行修改操作") return } //獲取指針
    ptr:=v.Elem() //獲取具體字段的封裝
    name:=ptr.FieldByName("Name") if name.Kind()!=reflect.String{ fmt.Printf("類型出錯 \n") return } //修改具體的值
    name.SetString("change") fmt.Println(add.Name) //簡單的修改整形
    ret:=999 addr:=reflect.ValueOf(&ret) addr.Elem().SetInt(123) fmt.Println(ret) //通過反射調用方法 //有參方法
    v1:=reflect.ValueOf(s) method1:=v1.MethodByName("Hello") arg:=[]reflect.Value{reflect.ValueOf(1)} method1.Call(arg) //調用無參數方法
    method2:=v1.MethodByName("World") var arg2 []reflect.Value method2.Call(arg2) }

簡單的反射操作

利用反射取出需要的結構體值

 

import (
"fmt"
"reflect"
"strings"
)

type T struct { A1 string A2 string B1 string A3 string A4 int } func main() { data := make([]string, 0) t := &T{"A11111", "A222222","B12212", "",1} object := reflect.ValueOf(t) ref := object.Elem() //類型 ty:=ref.Type() for i := 0; i < ref.NumField(); i++ { //獲取值 field := ref.Field(i) //不是string類型跳過 if field.Kind()!=reflect.String{ continue } //只要包含"A"的 if strings.Contains(ty.Field(i).Name,"A")&&field.String()!=""{ data = append(data, field.String()) } } fmt.Println(data) }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM