午夜视频免费看_日韩三级电影网站_国产精品久久一级_亚洲一级在线播放_人妻体内射精一区二区三区_91夜夜揉人人捏人人添红杏_91福利在线导航_国产又粗又猛又黄又爽无遮挡_欧美日韩一区在线播放_中文字幕一区二区三区四区不卡 _日日夜夜精品视频免费观看_欧美韩日一区二区三区

主頁 > 知識庫 > golang 如何用反射reflect操作結(jié)構(gòu)體

golang 如何用反射reflect操作結(jié)構(gòu)體

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

背景

需要遍歷結(jié)構(gòu)體的所有field

對于exported的field, 動態(tài)set這個field的value

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

思路

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

simpleStrtuctField 函數(shù)接受一個結(jié)構(gòu)體指針,因為最后希望改變其值,所以傳參必須是指針。然后解引用。

接下來遍歷結(jié)構(gòu)體的每個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的值也已經(jīng)獲取到

補充:go語言通過反射創(chuàng)建結(jié)構(gòu)體、賦值、并調(diào)用對應(yīng)方法

看代碼吧~

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) //返回對象的指針對應(yīng)的reflect.Value
	call = ptrValue.Interface().(*Call)
	trueValue := ptrValue.Elem() //獲取真實的結(jié)構(gòu)體類型
	trueValue.FieldByName("Num1").SetInt(123)//設(shè)置對象屬性,注意這個一定要是真實的結(jié)構(gòu)類型的reflect.Value才能調(diào)用,指針類型reflect.Value的會報錯
	//ptrValue.FieldByName("Num2").SetInt(23)
	trueValue.FieldByName("Num2").SetInt(23)
	//rValues = make([]reflect.Value, 0)
	rValues = append(rValues, reflect.ValueOf("xiaopeng"))//調(diào)用對應(yīng)的方法
	fmt.Println(rValues)
	trueValue.MethodByName("GetSub").Call(rValues)
	/*
	fixme 在反射中,指針的方法不可以給實際類型調(diào)用,實際類型的方法可以給指針類型調(diào)用,因為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 在實際使用中  指針和實體都能相互轉(zhuǎn)換,不會影響調(diào)用
	但是指針的方法在方法體內(nèi)的操作會影響到結(jié)構(gòu)體本身屬性
	而實體的方法不會,因為go對于結(jié)構(gòu)體、數(shù)組、基本類型都是值傳遞
	 */
	call.GetSub("aaa")
	(*call).GetSub("bbb")
	call.GetSum("ccc")
	(*call).GetSum("ddd")
}

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

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

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

巨人網(wǎng)絡(luò)通訊聲明:本文標題《golang 如何用反射reflect操作結(jié)構(gòu)體》,本文關(guān)鍵詞  golang,如,何用,反射,reflect,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《golang 如何用反射reflect操作結(jié)構(gòu)體》相關(guān)的同類信息!
  • 本頁收集關(guān)于golang 如何用反射reflect操作結(jié)構(gòu)體的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    亚洲精品亚洲人成人网| 亚洲在线视频网站| 国产又黄又猛又粗| 欧美一区二区视频在线观看2022| 亚洲精品一区二区二区| 欧美日韩精品欧美日韩精品一 | 人妻aⅴ无码一区二区三区| 亚洲欧美日韩一区二区在线| 亚洲av无码片一区二区三区| 亚洲日本精品| 欧美成人精品3d动漫h| 一级片视频网站| www.av毛片| 日韩精品最新网址| 中文字幕一区在线播放| 久久久久亚洲av无码专区喷水| 精品国产乱码久久久久久影片| 日本国产在线观看| 91视频 -- 69xx| 午夜精品久久久久久久99老熟妇 | 国产自产在线视频| 日韩精品免费在线视频观看| 美女一区二区视频| 亚洲av无一区二区三区久久| 国产精品久久久久不卡| 午夜精品福利在线| 国产亲伦免费视频播放| 国产精品久久久久久久乖乖| 日韩小视频在线观看| 95精品视频在线| 日本伦理一区二区三区| 亚洲一区二区三区乱码| 日韩成人免费视频| 99re视频精品| 精品国产乱码久久久久软件| 亚洲手机成人高清视频| 国语自产精品视频在线看抢先版图片 | 91丝袜高跟美女视频| 免费中文字幕视频| 日韩免费三级| 久久综合国产精品台湾中文娱乐网| 一级黄色片日本| 亚洲最大免费| 久久亚洲欧美日韩精品专区| 欧美激情综合五月色丁香小说| 日韩欧美三级视频| 久久久999精品| 国产亚洲一本大道中文在线| 天堂网av手机版| 午夜天堂在线视频| 亚洲欧美视频在线| 欧美国产日韩a欧美在线观看| 中文字幕超碰在线| 91超薄肉色丝袜交足高跟凉鞋| 成人精品水蜜桃| 亚洲国产精品系列| 亚洲日本在线天堂| 视频一区在线视频| 亚洲国产果冻传媒av在线观看| 欧美日韩一区二区视频在线| 成人高清在线视频| 久久97人妻无码一区二区三区| 国产毛片久久久久久国产毛片| 奇米影视亚洲狠狠色| 日韩av在线电影网| 亚洲欧美偷拍卡通变态| 亚洲黄色在线播放| 免费无遮挡无码永久在线观看视频| 超碰av在线免费观看| 日韩欧美在线一区二区| 国产成人精品网站| 亚洲美女www午夜| 亚洲狠狠爱一区二区三区| 成人激情小说网站| 丰满人妻一区二区三区免费| 强伦人妻一区二区三区| 国产精品欧美激情在线观看| 日本中文字幕精品| 国产精品免费久久久久久| 亚洲综合在线网站| 97caocao| 国产美女裸体无遮挡免费视频| 国产人成亚洲第一网站在线播放 | 国内精品久久久久影院 日本资源| 国产欧美日韩精品在线观看| 国产精品天天狠天天看| 91免费看片在线| 亚洲综合视频一区| 熟女俱乐部一区二区视频在线| 极品白嫩少妇无套内谢| 国产成人免费观看视频| 久久综合久久综合久久| 欧美大片欧美激情性色a∨久久| 午夜在线视频免费观看| 亚洲影视中文字幕| 91精品国产毛片武则天| 中国一级特黄录像播放| 国产极品久久久| 亚洲天堂视频网站| 亚洲免费大片在线观看| 久久精品国产久精国产一老狼| 国产视频1区2区3区| wwwxxx色| 亚洲天堂网在线观看视频| 日韩欧美国产午夜精品| 日本黄xxxxxxxxx100| 久久国产精品波多野结衣| 国产一区二区在线观看免费| 午夜精品久久久久久久久久久| 在线观看欧美日韩国产| 久久96国产精品久久99软件| 爱爱爱爱免费视频| 少妇精品无码一区二区免费视频| 国产精品免费精品一区| 亚洲免费在线视频| 欧美亚洲免费在线| 在线永久看片免费的视频| 欧美a视频在线观看| 国产精品人妻一区二区三区| 国产日韩综合av| 另类色图亚洲色图| 日韩av网站免费在线| 一区二区三区免费在线| 久久久久一区二区三区四区| 国内精品久久国产| 国产视频在线观看视频| 久久成人亚洲精品| 国产免费无遮挡吸奶头视频| 一区二区三区中文在线| 成人免费91在线看| 亚洲综合第一区| 精品黑人一区二区三区在线观看| 欧美日韩国产专区| 欧洲精品久久久| 国产精品熟妇一区二区三区四区| 久久这里只有精品免费| 精品中文av资源站在线观看| 亚洲美女喷白浆| 国产日韩在线观看av| 日本爱爱免费视频| 国产亚洲精品成人| 国产制服丝袜一区| 在线观看欧美www| 亚洲五月天综合| 国产91久久久| 国产成人精品亚洲777人妖| 日韩视频免费在线观看| 国产一级伦理片| 欧美日韩免费视频| 精品伦精品一区二区三区视频密桃| 亚洲欧洲日产国产网站| 亚欧美在线观看| 678五月天丁香亚洲综合网| 中文字幕免费视频| 欧美三级一区二区| 91制片厂毛片| 国产乱子轮精品视频| 国语对白做受69| 午夜探花在线观看| 免费看又黄又无码的网站| 国产jk精品白丝av在线观看| 国产精品私人自拍| 精品一区二区三区在线观看国产| 日韩精品一区二区三区视频 | 91久久国产自产拍夜夜嗨| 天堂中文在线网| 91蝌蚪国产九色| 亚洲欧洲日产国产网站| 久久性爱视频网站| 午夜精品久久久久久久99樱桃| 欧美另类暴力丝袜| 日韩欧美xxxx| 国产一区二区三区四区五区美女| 国产91成人video| 波多野结衣 久久| 国产精品一区二区女厕厕| 国产日本欧美一区| 国产视频一区在线观看| 少妇人妻互换不带套| 51午夜精品国产| 真人bbbbbbbbb毛片| 亚洲一区二区三区国产| 免费观看中文字幕| 久草中文综合在线| 欧美激情亚洲自拍| 亚洲国产精品免费在线观看| 欧美性色综合网| 国产肉体ⅹxxx137大胆| 欧美视频xxxx| 日韩精品免费在线视频| 精品免费国产一区二区| 国产日韩欧美一区二区三区乱码| 91极品女神在线| 青青青在线免费观看| 欧美午夜www高清视频| 91av一区二区三区| 精品视频久久久久| 欧美在线综合视频| 国产一区不卡在线观看| 999免费视频| 蜜桃成人在线| 日本高清久久久| 天堂www中文在线资源| 懂色中文一区二区在线播放| 亚洲欧美日韩另类| 国产农村妇女精品一区| 日韩一区二区麻豆国产| 精品1区2区| 麻豆91在线看| 国产成人精品电影久久久| 喷水视频在线观看| 中文字幕在线成人| 日日骚av一区二区| 久久综合九色欧美狠狠| 同产精品九九九| 人与动物性xxxx| 九九视频这里只有精品| 日韩精品一区二区亚洲av| 中日韩美女免费视频网址在线观看| 亚洲高清免费观看 | 尤物tv国产一区| 草草地址线路①屁屁影院成人| 欧美性生活一区| 最新版天堂资源在线| 欧美日韩亚洲视频| 午夜激情视频网| 欧美视频在线免费看| 日韩中文字幕在线视频观看| 国产精品卡一卡二卡三| 手机在线观看国产精品| 久久久国产精华| 成人午夜在线视频一区| 国产香蕉视频在线| 日本韩国欧美三级| 一本色道久久综合亚洲精品婷婷 | 欧美色另类天堂2015| 影音先锋欧美资源| 日韩va欧美va亚洲va久久| 欧美激情视频网站| 久草视频在线免费看| 日韩亚洲电影在线| 国产真实乱子伦| 国产在线不卡视频| 萌白酱国产一区二区| 污污的视频在线免费观看| 久久综合久中文字幕青草| 台湾佬中文在线| 成人有码在线视频| 国产有码在线观看| 欧美又大又硬又粗bbbbb| 800av在线免费观看| 亚洲三级电影网站| 国产极品国产极品| 蜜桃传媒视频麻豆第一区免费观看| 国产综合色视频| 久久久久久久久久久成人| 国产免费无遮挡吸奶头视频| 亚洲欧美国产日韩天堂区| 91精品在线视频观看| 欧美精品一区二区视频| 久久久久久av无码免费看大片| 国产精品第10页| 国产精品伊人色| 免费成人在线视频网站| 性色av一区二区三区在线观看| 欧美日韩亚洲高清| 久久99久久久久久久久久久| 国产a级黄色片| 精品视频导航| 欧美性视频一区二区三区| 91国内精品视频| 在线免费看v片| 国产精品免费看久久久香蕉| 久久影院视频免费| 手机毛片在线观看| 亚洲自拍第二页| 久久久久久国产精品免费免费| 国产精品久久久久影院老司| 中文字幕1区2区| 亚洲欧美日韩国产中文| 亚洲精品国产手机| 国产成人免费av| 肉色丝袜一区二区| 视频一区亚洲| 樱花草国产18久久久久| 国产高潮失禁喷水爽到抽搐| 在线看国产精品| 久久av中文字幕片| 97人人模人人爽人人澡| 日韩精品一区二区三区中文不卡| 亚洲精品国产手机| 欧美日本韩国国产| 日韩欧美精品在线视频| 91视频一区二区| 国产又粗又猛又黄又爽无遮挡| 国产人妻大战黑人20p| 偷窥少妇高潮呻吟av久久免费| 99精品视频99| 国产精品91在线观看| 色综合久久综合| 国产乱一区二区| 亚洲三级在线视频| 日本久久久a级免费| 亚洲女女做受ⅹxx高潮| avove在线播放| 国产精品一二三在线观看| 亚洲人成在线电影| 日韩经典一区二区| 美女露出粉嫩尿囗让男人桶| 国产精品久久久久久婷婷天堂| 久久亚洲欧美| 日本a级片免费观看| 91精品欧美一区二区三区综合在 | 日本中文字幕不卡免费| 国产欧美精品一区二区色综合| 无码aⅴ精品一区二区三区| av动漫在线观看| 九九久久国产精品| 国产精品国产三级国产aⅴ入口| www.av成人| 成人久久久精品乱码一区二区三区| 欧美成人在线免费| 青娱乐国产在线视频| 欧美俄罗斯性视频| 99久久夜色精品国产网站| 91 视频免费观看| 国产精品444| 欧美在线观看你懂的| 亚洲6080在线| 黄色小视频免费观看| 9i看片成人免费看片| 久草手机视频在线观看| 亚洲一区二区三区四区av| 穿情趣内衣被c到高潮视频| 国产精品嫩草视频| 久久99精品久久久久久青青91| 亚洲精品免费在线观看| 日本欧美www| 偷偷色噜狠狠狠狠的777米奇| 精品视频在线观看| 亚洲美女福利视频网站| 亚洲人精品午夜| 国产剧情久久久| 国产精品300页| 日本在线一区| 亚洲91精品在线| av中文字幕免费在线观看| 日韩在线观看网址| 国产三区在线成人av| 日本特黄特色aaa大片免费| 成人一区二区av| 欧美国产欧美亚洲国产日韩mv天天看完整 | 日韩中文字幕在线视频观看 | 国产免费xxx| 欧美人狂配大交3d怪物一区| 亚洲系列在线观看| 亚洲一二三av| 美日韩免费视频| 国产一区二区三区高清在线观看 | 天天操天天干天天操天天干| av7777777| 激情综合网俺也去| 国内外免费激情视频| 国产三级日本三级在线播放| 黄大色黄女片18第一次| 日韩中文字幕在线视频| 亚欧色一区w666天堂| 国产精品乱码人人做人人爱| 91麻豆精品视频| 国产精品一区免费在线观看| 蜜桃在线一区二区三区| 青青青国产在线| 婷婷色一区二区三区| 国产a√精品区二区三区四区| 日本一区二区三区四区高清视频 | 国产亚洲欧美日韩精品| 在线观看日韩国产| 久久久久国产精品厨房| 在线免费观看av片| 三上悠亚影音先锋| 一女被多男玩喷潮视频| 成人av网站大全| 中文字幕精品一区二| 91国模少妇一区二区三区| 黄色动漫网站入口| 欧美精品卡一卡二| 99中文字幕在线观看| 欧美精品一区二区性色a+v| 日韩av免费看| 色偷偷亚洲男人天堂| 寂寞少妇一区二区三区| 中文av一区二区三区| 国产视频九色蝌蚪| 日韩av成人网| 美国黄色片视频| 国产一区二区视频网站| 视频在线观看一区二区三区| 天天综合网天天综合| 国产美女一区二区三区| 欧美日韩国产综合新一区 | 亚洲精品一区二区口爆| 黑人巨大精品欧美一区| 99久久综合精品| 国产999精品久久久久久绿帽| 奇米精品一区二区三区在线观看| 成人毛片在线精品国产| 亚洲中文一区二区三区| 精品国产免费观看| 亚洲中文字幕无码爆乳av| 波多野结衣激情视频|