亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識庫 > golang 如何用反射reflect操作結構體

golang 如何用反射reflect操作結構體

熱門標簽:阿克蘇地圖標注 外呼系統顯本地手機號 壽光微信地圖標注 涿州代理外呼系統 電話機器人軟件免費 百度地圖標注后傳給手機 excel地圖標注分布數據 外呼系統用什么卡 評價高的400電話辦理

背景

需要遍歷結構體的所有field

對于exported的field, 動態set這個field的value

對于unexported的field, 通過強行取址的方法來獲取該值(tricky?)

思路

下面的代碼實現了從一個strct ptr對一個包外結構體進行取值的操作,這種場合在筆者需要用到反射的場合中出現比較多

simpleStrtuctField 函數接受一個結構體指針,因為最后希望改變其值,所以傳參必須是指針。然后解引用。

接下來遍歷結構體的每個field, exported字段是CanInterface的,對于unexported字段,需要強行取址來獲取其值

model.go

package model
type Person struct {
 Name string
 age  int
}
func NewPerson(name string, age int) *Person {
 return Person{
  Name: name,
  age:  age,
 }
}

main.go

package main
import (
	"github.com/miaomiao3/log"
	"../model"
	"reflect"
	"unsafe"
)
func main() {
	person := model.NewPerson("haha", 12)
	log.Debug("before:%+v", person)
	simpleStrtuctField(person)
	simpleStrtuctField(person)
	log.Debug("after:%+v", person)
}
// get unexported field
func simpleStrtuctField(v interface{}) {
	dataType := reflect.TypeOf(v)
	dataValue := reflect.ValueOf(v)
	if dataType.Kind() == reflect.Ptr {
		if dataValue.IsNil() {
			panic("nil ptr")
		}
		// 如果是指針,則要判斷一下是否為struct
		originType := reflect.ValueOf(v).Elem().Type()
		if originType.Kind() != reflect.Struct {
			return
		}
		// 解引用
		dataValue = dataValue.Elem()
		dataType = dataType.Elem()
	} else {
		panic("non ptr")
	}
	num := dataType.NumField()
	for i := 0; i  num; i++ {
		field := dataType.Field(i)
		fieldName := field.Name
		fieldValue := dataValue.FieldByName(fieldName)
		if !fieldValue.IsValid() {
			continue
		}
		if fieldValue.CanInterface() {
			log.Debug("exported fieldName:%v value:%v", fieldName, fieldValue.Interface())
			if fieldValue.CanSet()  fieldValue.Kind() == reflect.String {
				oldValue := fieldValue.Interface().(string)
				fieldValue.SetString(oldValue + " auto append")
			}
		} else {
			// 強行取址
			forceValue := reflect.NewAt(fieldValue.Type(), unsafe.Pointer(fieldValue.UnsafeAddr())).Elem()
			log.Debug("unexported fieldName:%v value:%v", fieldName, forceValue.Interface())
		}
	}
}

output:

2019/06/02 17:15:31.64 [D] before:{Name:haha age:12}

2019/06/02 17:15:31.64 [D] exported fieldName:Name value:haha

2019/06/02 17:15:31.64 [D] unexported fieldName:age value:12

2019/06/02 17:15:31.64 [D] after:{Name:haha auto append age:12}

可以看到,Name字段被反射改變了,age的值也已經獲取到

補充:go語言通過反射創建結構體、賦值、并調用對應方法

看代碼吧~

package main
import (
	"fmt"
	"reflect"
	"testing"
)
type Call struct {
	Num1 int
	Num2 int
}
func (call Call) GetSub(name string){
	fmt.Printf("%v 完成了減法運算,%v - %v = %v \n", name, call.Num1, call.Num2, call.Num1 - call.Num2)
}
func (call *Call) GetSum(name string){
	fmt.Printf("%v 完成了加法運算,%v + %v = %v \n", name, call.Num1, call.Num2, call.Num1 + call.Num2)
}
func TestReflect(t *testing.T) {
	var (
		call *Call
		rValues []reflect.Value
		rValues2 []reflect.Value
	)
	ptrType := reflect.TypeOf(call) //獲取call的指針的reflect.Type
	trueType := ptrType.Elem() //獲取type的真實類型
	ptrValue := reflect.New(trueType) //返回對象的指針對應的reflect.Value
	call = ptrValue.Interface().(*Call)
	trueValue := ptrValue.Elem() //獲取真實的結構體類型
	trueValue.FieldByName("Num1").SetInt(123)//設置對象屬性,注意這個一定要是真實的結構類型的reflect.Value才能調用,指針類型reflect.Value的會報錯
	//ptrValue.FieldByName("Num2").SetInt(23)
	trueValue.FieldByName("Num2").SetInt(23)
	//rValues = make([]reflect.Value, 0)
	rValues = append(rValues, reflect.ValueOf("xiaopeng"))//調用對應的方法
	fmt.Println(rValues)
	trueValue.MethodByName("GetSub").Call(rValues)
	/*
	fixme 在反射中,指針的方法不可以給實際類型調用,實際類型的方法可以給指針類型調用,因為go語言對這種操作做了封裝
	所以下面一句是沒問題的
	下下一句會運行時報錯
	 */
	//ptrValue.MethodByName("GetSub").Call(rValues)
	//trueValue.MethodByName("GetSum").Call(append(rValues2, reflect.ValueOf("hiram")))
	ptrValue.MethodByName("GetSum").Call(append(rValues2, reflect.ValueOf("hiram")))
	fmt.Println(call)
	
	/*
	fixme 在實際使用中  指針和實體都能相互轉換,不會影響調用
	但是指針的方法在方法體內的操作會影響到結構體本身屬性
	而實體的方法不會,因為go對于結構體、數組、基本類型都是值傳遞
	 */
	call.GetSub("aaa")
	(*call).GetSub("bbb")
	call.GetSum("ccc")
	(*call).GetSum("ddd")
}

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • golang 實現兩個結構體復制字段
  • golang通過反射設置結構體變量的值
  • Golang空結構體struct{}用途,你知道嗎
  • golang修改結構體中的切片值方法
  • Golang自定義結構體轉map的操作
  • golang 結構體初始化時賦值格式介紹
  • 解決golang結構體tag編譯錯誤的問題

標簽:重慶 蘭州 吐魯番 欽州 銅川 汕頭 雞西 梅河口

巨人網絡通訊聲明:本文標題《golang 如何用反射reflect操作結構體》,本文關鍵詞  golang,如,何用,反射,reflect,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《golang 如何用反射reflect操作結構體》相關的同類信息!
  • 本頁收集關于golang 如何用反射reflect操作結構體的相關信息資訊供網民參考!
  • 推薦文章
    999久久狠狠免费精品| 久久久久久久男人的天堂| 美女免费精品高清毛片在线视| 日本伦理黄色大片在线观看网站| 免费的黄视频| 一级片片| 国产精品免费久久| 亚洲不卡一区二区三区在线 | 美女免费黄网站| 久久久久久久男人的天堂| 黄视频网站在线看| 久久99这里只有精品国产| 国产福利免费视频| 午夜在线亚洲| 青青久久精品国产免费看| 免费国产在线观看| 精品久久久久久综合网| 四虎久久精品国产| 欧美一级视频免费观看| 一a一级片| 欧美国产日韩一区二区三区| 欧美电影免费看大全| 91麻豆国产级在线| 韩国妈妈的朋友在线播放| 四虎影视库| 欧美激情在线精品video| 国产一级生活片| 欧美另类videosbestsex视频| 日韩中文字幕在线观看视频| 九九热精品免费观看| 久久国产影院| 国产不卡福利| 超级乱淫黄漫画免费| 沈樵在线观看福利| 99久久网站| 亚洲不卡一区二区三区在线 | 欧美国产日韩在线| 精品国产一区二区三区久| 精品在线观看一区| 97视频免费在线| 99色吧| 免费一级片在线观看| 国产麻豆精品高清在线播放| 黄色短视屏| 成人免费网站久久久| 欧美a级成人淫片免费看| 国产一区二区精品久久| 天天色色色| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 日韩欧美一二三区| 精品视频在线看 | 成人免费观看男女羞羞视频| 日日日夜夜操| 999精品视频在线| 色综合久久天天综合观看| 一级毛片视频在线观看| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 日本伦理网站| 国产麻豆精品免费密入口 | 青青青草视频在线观看| 日韩av片免费播放| 色综合久久天天综合绕观看| 青青久热| 精品久久久久久综合网| 亚洲精品影院久久久久久| 国产成a人片在线观看视频| 成人影院久久久久久影院| 亚洲女人国产香蕉久久精品 | 欧美国产日韩精品| 亚洲第一视频在线播放| 国产一区二区福利久久| 久久精品大片| 免费一级片在线观看| 欧美电影免费看大全| 精品视频一区二区三区| 国产麻豆精品视频| 国产精品自拍亚洲| 亚欧乱色一区二区三区| 久久99青青久久99久久| 91麻豆精品国产自产在线观看一区 | 欧美激情一区二区三区在线播放| 欧美a免费| 国产福利免费视频| 国产极品精频在线观看| a级毛片免费全部播放| 精品视频在线观看视频免费视频| 欧美另类videosbestsex视频| 精品国产三级a∨在线观看| 九九精品在线播放| 天天做日日干| 国产麻豆精品免费密入口 | 国产网站免费在线观看| 九九免费高清在线观看视频| 欧美a级大片| 91麻豆精品国产高清在线| 精品视频免费在线| 精品久久久久久综合网| 成人高清免费| 国产精品自拍在线观看| 精品国产一区二区三区久| 尤物视频网站在线| 国产美女在线观看| 成人a级高清视频在线观看| a级黄色毛片免费播放视频| 亚洲 欧美 91| 亚洲不卡一区二区三区在线 | 精品视频在线看 | 国产一区二区精品尤物| 午夜精品国产自在现线拍| 欧美1区| 亚久久伊人精品青青草原2020| 免费国产在线观看| 999久久久免费精品国产牛牛| 青青久久精品国产免费看| 日本伦理网站| 九九精品影院| 亚洲www美色| 国产91精品一区| 黄视频网站在线免费观看| 精品久久久久久影院免费| 午夜在线亚洲| 久久福利影视| 国产亚洲精品aaa大片| 99久久精品国产片| 日本免费区| 国产麻豆精品视频| 久久国产精品只做精品| 色综合久久手机在线| a级毛片免费观看网站| 欧美一级视| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 国产高清视频免费| 亚洲精品影院| 午夜激情视频在线播放| 九九久久国产精品| 高清一级片| 国产一区二区精品久久91| 香蕉视频三级| 久久久久久久久综合影视网| 精品视频免费在线| 精品视频在线看 | 国产精品1024永久免费视频| 国产a网| 99久久网站| 日韩专区亚洲综合久久| 99久久精品国产免费| 日本特黄特黄aaaaa大片| 午夜精品国产自在现线拍| 国产不卡在线播放| 九九免费高清在线观看视频| 国产一区精品| 免费一级生活片| 99久久精品国产国产毛片| 黄色短视屏| 成人高清视频免费观看| 欧美另类videosbestsex高清| 欧美激情一区二区三区在线| 日韩在线观看视频网站| 天天做日日干| 精品久久久久久影院免费| 一级毛片视频在线观看| 日韩中文字幕在线观看视频| 日韩av成人| 日本特黄特色aaa大片免费| 一级女性全黄生活片免费| 国产不卡福利| 国产高清在线精品一区二区| 尤物视频网站在线观看| 黄色短视屏| 精品久久久久久中文字幕2017| 一本高清在线| 久久成人亚洲| 欧美国产日韩精品| 九九精品影院| 99久久精品国产片| 九九久久99综合一区二区| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 精品国产一区二区三区久久久蜜臀| 成人免费观看网欧美片| 九九热精品免费观看| 韩国妈妈的朋友在线播放| 久久成人亚洲| 日韩在线观看视频免费| 久草免费在线色站| 九九免费精品视频| 国产网站免费视频| 国产网站免费| 日韩在线观看视频黄| 欧美a级片视频| 天天做人人爱夜夜爽2020毛片| 可以免费看污视频的网站| 超级乱淫黄漫画免费| 亚洲精品久久久中文字| 天天做人人爱夜夜爽2020毛片| 精品在线免费播放| 色综合久久天天综合绕观看| 国产不卡在线播放| 日本在线www| 日本免费乱理伦片在线观看2018|