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

主頁 > 知識庫 > 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操作結構體的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧美tickle裸体挠脚心vk| 国产精品一区一区| 91日韩精品一区| 奇米色一区二区| 一区二区三区成人在线视频| 久久久久久麻豆| 精品成人私密视频| 在线观看国产一区二区| 久久成人精品无人区| 亚洲女人小视频在线观看| 久久久久久久精| 欧美亚洲日本国产| 五月开心婷婷久久| 亚洲国产精品久久不卡毛片| 欧美色大人视频| 成人开心网精品视频| 欧美精品一区二区三区在线播放| 欧美国产精品中文字幕| 欧美艳星brazzers| 欧美专区在线观看一区| 亚洲国产精品久久人人爱蜜臀| 日韩欧美一二三区| 五月天久久比比资源色| 最新国产精品久久精品| 国产日韩欧美一区二区三区综合| 欧美一区二区三区爱爱| 欧美特级限制片免费在线观看| 色综合天天综合色综合av| av动漫一区二区| 99riav一区二区三区| 91麻豆.com| 成人三级伦理片| eeuss国产一区二区三区| 成人禁用看黄a在线| 99re亚洲国产精品| 在线精品视频免费播放| 日韩欧美激情在线| 欧美不卡一区二区三区| 欧美日韩一级黄| 欧美日韩一区不卡| 7799精品视频| 久久综合九色综合欧美亚洲| 亚洲三级小视频| 粉嫩aⅴ一区二区三区四区| 色综合久久久久综合99| 韩国三级电影一区二区| 精品一二三四区| 精品91自产拍在线观看一区| 成人网页在线观看| 青青草国产精品97视觉盛宴 | 国产高清亚洲一区| 一区二区三区在线不卡| 国产欧美日韩综合精品一区二区| 欧美日韩情趣电影| 色av一区二区| 99国产精品国产精品毛片| 国产尤物一区二区| 国产剧情一区在线| 韩国欧美国产1区| 激情六月婷婷久久| 国产麻豆精品久久一二三| 欧美aⅴ一区二区三区视频| 欧美精品视频www在线观看| 欧美日韩中文精品| 4438亚洲最大| 日韩美女视频在线| 精品91自产拍在线观看一区| 26uuu国产电影一区二区| 日韩欧美中文字幕公布| 欧美xxx久久| 26uuu欧美| 国产精品视频九色porn| 最新热久久免费视频| 中文字幕av资源一区| 国产精品全国免费观看高清| 日韩伦理电影网| 亚洲一区二区三区四区在线免费观看| 国产精品丝袜一区| 亚洲高清在线视频| 美腿丝袜在线亚洲一区| 国产一区二区在线免费观看| 粉嫩嫩av羞羞动漫久久久 | 蜜臀va亚洲va欧美va天堂| 九九精品视频在线看| 国产精品99久久久久久宅男| 91在线你懂得| 91精品久久久久久久久99蜜臂 | 香蕉久久夜色精品国产使用方法| 色哟哟一区二区三区| 欧美电影在线免费观看| 精品乱人伦小说| 国产精品久久久久久福利一牛影视| 日本一区二区电影| 午夜视频在线观看一区| 五月婷婷综合网| 国产精品一区二区三区99| 色婷婷精品久久二区二区蜜臂av| 欧美一区二视频| 国产精品免费av| 日本中文字幕一区二区有限公司| 国产盗摄精品一区二区三区在线 | 国产麻豆精品95视频| voyeur盗摄精品| 欧美精品tushy高清| 国产午夜精品久久久久久久| 亚洲一卡二卡三卡四卡| 久久国内精品自在自线400部| 成人性生交大片免费看中文 | 中文字幕乱码一区二区免费| 亚洲精品免费在线| 精品一区二区三区在线播放视频| 色婷婷综合久久久| 欧美国产精品一区二区三区| 丝袜诱惑制服诱惑色一区在线观看| 懂色av一区二区在线播放| 日韩三级av在线播放| 亚洲女与黑人做爰| 国产成人综合在线| 精品黑人一区二区三区久久| 亚洲免费av高清| 不卡视频一二三四| 精品99999| 精品一区二区三区在线视频| 欧美日本在线播放| 亚洲人吸女人奶水| 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | 成人丝袜高跟foot| 精品国产乱码久久久久久老虎| 亚洲一卡二卡三卡四卡| 91视频.com| 国产精品国产三级国产aⅴ原创 | 99re这里只有精品6| 久久免费午夜影院| 激情五月婷婷综合| 久久综合丝袜日本网| 麻豆成人免费电影| 日韩欧美在线不卡| 老色鬼精品视频在线观看播放| 欧美日韩专区在线| 日韩精品视频网| 国产综合色在线视频区| 欧美日韩在线三区| 日韩精品一卡二卡三卡四卡无卡| 欧美欧美午夜aⅴ在线观看| 亚洲国产成人91porn| 欧美日韩中文国产| 视频一区视频二区中文字幕| 欧美视频在线观看一区| 亚洲h在线观看| 欧美zozo另类异族| 黄色成人免费在线| 中文字幕中文乱码欧美一区二区| 99re视频精品| 亚洲尤物视频在线| 欧美日本国产一区| 精品一区二区三区免费播放| 国产日产欧美一区二区三区| 北条麻妃国产九九精品视频| 亚洲欧洲综合另类| 欧美精品国产精品| 国内精品免费在线观看| 中文字幕高清不卡| 欧美三级中文字幕在线观看| 日韩av在线免费观看不卡| 精品久久人人做人人爱| 国产成人精品亚洲777人妖| 亚洲欧美日韩中文播放| 555www色欧美视频| 国产精品一区二区三区乱码| 欧美一区二区三区视频在线| 玖玖九九国产精品| 中文字幕亚洲在| 日本高清不卡aⅴ免费网站| 久久国产麻豆精品| 国产精品久久久久久久第一福利| 欧洲精品中文字幕| 韩国三级中文字幕hd久久精品| 亚洲裸体xxx| 6080yy午夜一二三区久久| 国产麻豆午夜三级精品| 亚洲图片欧美视频| 久久久精品tv| 欧美久久免费观看| 国产91在线看| 另类小说综合欧美亚洲| 中文av一区二区| 欧美性猛交一区二区三区精品 | 99精品欧美一区二区蜜桃免费| 亚洲不卡av一区二区三区| 国产亚洲精品bt天堂精选| 色香色香欲天天天影视综合网| 日本午夜精品视频在线观看| 亚洲色图都市小说| 久久久久国产免费免费| 欧美日韩三级视频| 欧美日韩国产综合一区二区| 97久久精品人人做人人爽| 国产suv精品一区二区三区| 久久黄色级2电影| 日韩在线一区二区三区|