婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

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

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

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

背景

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

對(duì)于exported的field, 動(dòng)態(tài)set這個(gè)field的value

對(duì)于unexported的field, 通過(guò)強(qiáng)行取址的方法來(lái)獲取該值(tricky?)

思路

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

simpleStrtuctField 函數(shù)接受一個(gè)結(jié)構(gòu)體指針,因?yàn)樽詈笙M淖兤渲担詡鲄⒈仨毷侵羔槨H缓蠼庖谩?/p>

接下來(lái)遍歷結(jié)構(gòu)體的每個(gè)field, exported字段是CanInterface的,對(duì)于unexported字段,需要強(qiáng)行取址來(lái)獲取其值

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 {
			// 強(qiáng)行取址
			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)獲取到

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

看代碼吧~

package main
import (
	"fmt"
	"reflect"
	"testing"
)
type Call struct {
	Num1 int
	Num2 int
}
func (call Call) GetSub(name string){
	fmt.Printf("%v 完成了減法運(yùn)算,%v - %v = %v \n", name, call.Num1, call.Num2, call.Num1 - call.Num2)
}
func (call *Call) GetSum(name string){
	fmt.Printf("%v 完成了加法運(yùn)算,%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的真實(shí)類型
	ptrValue := reflect.New(trueType) //返回對(duì)象的指針對(duì)應(yīng)的reflect.Value
	call = ptrValue.Interface().(*Call)
	trueValue := ptrValue.Elem() //獲取真實(shí)的結(jié)構(gòu)體類型
	trueValue.FieldByName("Num1").SetInt(123)//設(shè)置對(duì)象屬性,注意這個(gè)一定要是真實(shí)的結(jié)構(gòu)類型的reflect.Value才能調(diào)用,指針類型reflect.Value的會(huì)報(bào)錯(cuò)
	//ptrValue.FieldByName("Num2").SetInt(23)
	trueValue.FieldByName("Num2").SetInt(23)
	//rValues = make([]reflect.Value, 0)
	rValues = append(rValues, reflect.ValueOf("xiaopeng"))//調(diào)用對(duì)應(yīng)的方法
	fmt.Println(rValues)
	trueValue.MethodByName("GetSub").Call(rValues)
	/*
	fixme 在反射中,指針的方法不可以給實(shí)際類型調(diào)用,實(shí)際類型的方法可以給指針類型調(diào)用,因?yàn)間o語(yǔ)言對(duì)這種操作做了封裝
	所以下面一句是沒(méi)問(wèn)題的
	下下一句會(huì)運(yùn)行時(shí)報(bào)錯(cuò)
	 */
	//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 在實(shí)際使用中  指針和實(shí)體都能相互轉(zhuǎn)換,不會(huì)影響調(diào)用
	但是指針的方法在方法體內(nèi)的操作會(huì)影響到結(jié)構(gòu)體本身屬性
	而實(shí)體的方法不會(huì),因?yàn)間o對(duì)于結(jié)構(gòu)體、數(shù)組、基本類型都是值傳遞
	 */
	call.GetSub("aaa")
	(*call).GetSub("bbb")
	call.GetSum("ccc")
	(*call).GetSum("ddd")
}

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

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

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

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《golang 如何用反射reflect操作結(jié)構(gòu)體》,本文關(guān)鍵詞  golang,如,何用,反射,reflect,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《golang 如何用反射reflect操作結(jié)構(gòu)體》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于golang 如何用反射reflect操作結(jié)構(gòu)體的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    亚洲成人第一页| 粉嫩av一区二区三区粉嫩| 亚洲va韩国va欧美va精品 | 欧美精品一区二区在线播放| 精品欧美一区二区久久| 中文字幕精品—区二区四季| 亚洲美女一区二区三区| 亚洲欧洲精品天堂一级| 亚洲伊人色欲综合网| 韩国精品主播一区二区在线观看| 国产精品性做久久久久久| 国产99久久久久| 欧美性猛片xxxx免费看久爱| 精品理论电影在线观看| 久久蜜桃av一区精品变态类天堂| 最新国产の精品合集bt伙计| 日本不卡免费在线视频| 99精品在线观看视频| 日韩午夜激情免费电影| 亚洲美女在线国产| 成人小视频免费在线观看| 欧美吻胸吃奶大尺度电影 | 国产丝袜美腿一区二区三区| 国产精品灌醉下药二区| 精品一区二区三区视频| 欧美日韩三级一区二区| 国产精品久久久久久妇女6080| 奇米888四色在线精品| 成人av在线一区二区| 91精品国产综合久久婷婷香蕉 | 一区二区三区欧美日韩| 国产一区二区三区久久悠悠色av| 欧美视频一区二区三区四区| 中文字幕不卡的av| 韩国精品一区二区| 日韩欧美成人激情| 日韩主播视频在线| 欧洲激情一区二区| 中文字幕一区视频| 蜜桃精品视频在线观看| 97se亚洲国产综合在线| 久久亚洲综合色一区二区三区| 日韩主播视频在线| 在线精品国精品国产尤物884a| 久久精品视频一区二区三区| 奇米四色…亚洲| 欧美美女直播网站| 一区二区三区毛片| 91久久一区二区| 亚洲欧洲成人自拍| 99久久婷婷国产| 国产精品青草综合久久久久99| 国产福利视频一区二区三区| 精品欧美久久久| 国内精品伊人久久久久av影院| 欧美放荡的少妇| 天天色天天爱天天射综合| 色欧美乱欧美15图片| 中文字幕制服丝袜成人av| 不卡影院免费观看| 亚洲狼人国产精品| 欧美日韩一区久久| 日本中文在线一区| 欧美高清精品3d| 日本成人在线一区| 久久久综合九色合综国产精品| 国产精品一区在线观看你懂的| 国产午夜亚洲精品羞羞网站| 不卡一区中文字幕| 亚洲精品视频一区二区| 911精品国产一区二区在线| 日本亚洲免费观看| 久久久不卡影院| 99re这里都是精品| 亚洲风情在线资源站| 欧美另类久久久品| 极品美女销魂一区二区三区| 日本一区二区三区视频视频| 色美美综合视频| 丝袜美腿高跟呻吟高潮一区| 日韩欧美在线网站| 99视频热这里只有精品免费| 尤物视频一区二区| 欧美一级电影网站| a在线欧美一区| 日韩高清电影一区| 国产日韩欧美综合一区| 欧美无砖专区一中文字| 国产一区二区不卡在线| 亚洲精品中文在线| 日韩欧美国产一区二区在线播放| 99在线精品观看| 一区二区三区四区在线播放 | 亚洲男人的天堂av| 日韩免费视频一区二区| 成人午夜在线免费| 日韩精品1区2区3区| 久久久久久电影| 欧美精品三级在线观看| 成人午夜精品在线| 麻豆国产精品视频| 亚洲综合自拍偷拍| 欧美高清在线精品一区| 欧美一级在线免费| 欧美午夜影院一区| 成人在线综合网| 久久精品国产精品青草| 亚洲综合一二三区| 亚洲国产精品t66y| 欧美精品乱码久久久久久| 成人动漫在线一区| 国产一区二区h| 免费观看在线综合色| 夜夜嗨av一区二区三区中文字幕 | 欧美性极品少妇| 成人三级伦理片| 日韩国产在线一| 久久亚洲影视婷婷| 99精品热视频| 国产精品久久久久毛片软件| 久久不见久久见免费视频7| 久久久久久夜精品精品免费| 色国产综合视频| 韩国女主播一区二区三区| 一区二区三区在线视频免费观看| 7777精品伊人久久久大香线蕉经典版下载 | 日韩专区在线视频| 国产精品网站在线| 欧美一区二区精品在线| 色悠悠亚洲一区二区| 国产乱人伦偷精品视频免下载| 亚洲丶国产丶欧美一区二区三区| 精品国产网站在线观看| 欧美在线观看禁18| 99精品视频一区| 成人精品高清在线| 国产酒店精品激情| 精品亚洲porn| 麻豆一区二区在线| 天天色综合成人网| 亚洲一区视频在线观看视频| 中文字幕一区二区三区四区不卡 | 成人一二三区视频| 精品一区二区三区日韩| 美女在线视频一区| 蜜桃av一区二区在线观看| 免费看日韩a级影片| 亚洲高清免费在线| 天天综合天天综合色| 性感美女极品91精品| 亚洲va欧美va国产va天堂影院| 亚洲综合视频在线| 亚洲一卡二卡三卡四卡无卡久久| 亚洲黄色免费网站| 亚洲一区二区精品3399| 亚洲成人三级小说| 蜜臀va亚洲va欧美va天堂| 日韩电影网1区2区| 精品一区二区三区香蕉蜜桃 | 欧美日韩日本视频| 91精品国产综合久久精品性色| 欧美男人的天堂一二区| 日韩女优视频免费观看| 亚洲精品一区二区三区99| 国产亚洲午夜高清国产拍精品| 欧美韩国日本一区| 亚洲欧洲日韩av| 亚洲在线中文字幕| 日本午夜一本久久久综合| 三级欧美在线一区| 国产一区999| 91亚洲精品久久久蜜桃网站| 欧美午夜不卡视频| 精品少妇一区二区三区在线视频| 久久久久久久久久久久久夜| 中文字幕一区二区日韩精品绯色| 洋洋成人永久网站入口| 日日欢夜夜爽一区| 成人午夜视频免费看| 欧美日本高清视频在线观看| 精品欧美久久久| 亚洲三级在线观看| 免费精品视频在线| 91免费看视频| 日韩精品一区二区三区在线| 中文乱码免费一区二区| 婷婷综合久久一区二区三区| 精品一区二区三区的国产在线播放| 久久99蜜桃精品| 色综合久久88色综合天天 | 久久99九九99精品| 91女厕偷拍女厕偷拍高清| 日韩一区二区免费在线电影| 成人美女在线观看| 国产精品久久久久精k8| 国产成人免费视频一区| 国产欧美日韩精品在线| 国产成人免费av在线| 国产亚洲欧美日韩日本| 国产盗摄一区二区|