GO反射類例項

2022-09-07 15:06:17 字數 3728 閱讀 1451

型別資訊:是靜態的元資訊,是預先定義好的

值資訊:是程式執行過程中動態改變的

獲取型別資訊:reflect.typeof,是靜態的

獲取值資訊:reflect.valueof,是動態的

反射獲取inte***ce值資訊

package main

import (

"fmt"

"reflect"

)//反射獲取inte***ce值資訊

func reflect_value(a inte***ce{})

}func main()

反射修改值資訊

package main

import (

"fmt"

"reflect"

)//反射修改值

func reflect_set_value(a inte***ce{})

}func main()

檢視型別、欄位和方法

package main

import (

"fmt"

"reflect"

)// 定義結構體

type user struct

// 綁方法

func (u user) hello()

// 傳入inte***ce{}

func poni(o inte***ce{})

fmt.println("***************==方法********************")

for i := 0; i < t.nummethod(); i++

}func main()

poni(u)

}

檢視匿名字段

package main

import (

"fmt"

"reflect"

)// 定義結構體

type user struct

// 匿名字段

type boy struct

func main() , "bj"}

t := reflect.typeof(m)

fmt.println(t)

// anonymous:匿名

fmt.printf("%#v\n", t.field(0))

// 值資訊

fmt.printf("%#v\n", reflect.valueof(m).field(0))

}

修改結構體的值

package main

import (

"fmt"

"reflect"

)// 定義結構體

type user struct

// 修改結構體值

func setvalue(o inte***ce{})

}func main()

setvalue(&u)

fmt.println(u)

}

呼叫方法

package main

import (

"fmt"

"reflect"

)// 定義結構體

type user struct

func (u user) hello(name string)

func main()

v := reflect.valueof(u)

// 獲取方法

m := v.methodbyname("hello")

// 構建一些引數

args := reflect.value

// 沒引數的情況下:var args2 reflect.value

// 呼叫方法,需要傳入方法的引數

m.call(args)

}

獲取欄位的tag

package main

import (

"fmt"

"reflect"

)type student struct

func main()

方法

package common

import (

"errors"

"reflect"

"strconv"

"time"

)//根據結構體中sql標籤對映資料到結構體中並且轉換型別

func datatostructbytagsql(data map[string]string, obj inte***ce{})

}//設定型別值

objvalue.fieldbyname(name).set(val)

}}//型別轉換

func typeconversion(value string, ntype string) (reflect.value, error) else if ntype == "time.time" else if ntype == "time" else if ntype == "int" else if ntype == "int8" else if ntype == "int32" else if ntype == "int64" else if ntype == "float32" else if ntype == "float64"

//else if .......增加其他一些型別的轉換

return reflect.valueof(value), errors.new("未知的型別:" + ntype)

}

呼叫

)//product product定義乙個結構體

type product struct

func main()

productresult := &product{}

common.datatostructbytagsql(data, productresult)

fmt.println(*productresult)

//這塊是模擬mysql獲取所有的資料反射到結構體

alldata := map[string]string,,}

var productarray *product

for _, v := range alldata

common.datatostructbytagsql(v, allproduct)

}for _, vv := range productarray

}

c 通過反射 例項化類

1.用type 在 website 下 userdao userdao userdao type.gettype userdaopath getconstructor system.type.emptytypes invoke null 如果構造方法有引數的話,這樣。定義引數型別陣列 type tp...

C 反射例項 一 利用反射使用類庫

首先我們建立乙個類庫,將它生成為helloworld.dll,using system using system.collections.generic using system.text namespace webtest public class reflecttest inte ce1 set...

C 反射通過類名例項化類

在物件導向程式設計的時候,會遇到這樣的問題,乙個父類有多個子類,需要建立乙個父類的物件,再後面根據條件去把該物件例項化具體的某個子類,然後進行操作。當然用if else 或者switch來做也可以,但是後期擴充套件性不好,特別是要把這些類封裝成dll提供給被人用,更不合適了。這時候反射就提供了很好的...