日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

一篇學會Go中reflect反射的詳細用法

來源: 責編: 時間:2024-05-11 09:21:05 234觀看
導讀應用場景1.判斷函數變量是否否和標準2.驗證接口值是否合理如(是否為空,傳入的字段是否合規)3.獲取變量的類型進行斷言等操作在Go語言的反射機制中,任何接口值都由是一個具體類型和具體類型的值兩部分組成的(我們在上一篇

應用場景

1.判斷函數變量是否否和標準gwF28資訊網——每日最新資訊28at.com

2.驗證接口值是否合理如(是否為空,傳入的字段是否合規)gwF28資訊網——每日最新資訊28at.com

3.獲取變量的類型進行斷言等操作gwF28資訊網——每日最新資訊28at.com

在Go語言的反射機制中,任何接口值都由是一個具體類型和具體類型的值兩部分組成的(我們在上一篇接口的博客中有介紹相關概念)。 在Go語言中反射的相關功能由內置的reflect包提供,任意接口值在反射中都可以理解為由reflect.Type和reflect.Value兩部分組成,并且reflect包提供了reflect.TypeOf和reflect.ValueOf兩個函數來獲取任意對象的Value和Type。gwF28資訊網——每日最新資訊28at.com

1.結構體中使用反射

  • 獲取 2 種類型信息的方法:

reflect.TypeOf() 獲取類型信息,返回 Type 類型;gwF28資訊網——每日最新資訊28at.com

reflect.ValueOf() 獲取數據信息,返回 Value 類型。gwF28資訊網——每日最新資訊28at.com

反射中值的可設置性,可以用 CanSet 方法來判斷值是否可以設置。在 Go 中,函數參數的傳遞都是值拷貝,在反射中要修改值,必須傳遞指針,并且用 Elem() 方法獲取指針的值,然后進行修改。
gwF28資訊網——每日最新資訊28at.com

reflect.ValueOf() 返回的 Value 類型:

  • 它有一個 Type() 方法,返回的是 reflect.Value 的 Type
  • 它有獲取 Value 類型值的方法如果我們知道是 float 類型,所以直接用 Float() 方法。如果不知道具體類型呢?由上面例子可知用 Interface() 方法,然后在進行類型斷言 v.Interface().(float64) 來判斷獲取值

v.Kind() 和 v.Type() 區別:

在 type MyInt int 里,v.Kind() 與 v.Type() 返回了不同的類型值,Kind()返回的是 int,Type() 返回的是 MyInt。在 Go 中,可以用 type 關鍵字定義自定義類型,Kind() 方法返回底層類型。比如還有結構體,指針等類型用 type 定義的,那么 Kind() 方法就可以獲取這些類型的底層類型。gwF28資訊網——每日最新資訊28at.com

案例使用方法

package mainimport (	"fmt"	"reflect")type Userinfo struct {	Age      int `id:"iloveyou" num:"222"` //tag標簽信息	UserName string}func GetReflickInfo(i interface{}) {	vl := reflect.ValueOf(i)	//nii := 200	fmt.Println("kind ======", vl.Kind())	if vl.Kind() == reflect.Ptr { //如是指針類型,先取值		vl = vl.Elem() //Elem方法就是取值操作	}	vlt := vl.Type() //獲取具體類型,如自定義結構體的類型	fmt.Println("kind ======type===", vl.Kind(), vlt)	if vl.Kind() != reflect.Struct {		fmt.Println("類型:", vlt, " 名字:", vlt.Name(), " 數值:", vl)		//如是整數種類,又可以修改,CanSet屬性為true,則進行修改。		if vl.Kind() == reflect.Int || vl.Kind() == reflect.Int64 && vl.CanSet() {			vl.SetInt(100)			//reflect.New(vlt)是創建了一個vlt類型的指針變量。			ni := reflect.New(vlt)			//創建后的ni是reflect.Value對象,需要通過ValueOf來賦值			ni = reflect.ValueOf(222)			fmt.Println("修改后int數值:", vl, "新建數值:", ni)		}		//如是浮點數種類,又可以修改,CanSet屬性為true,則進行修改。		//可設置性檢查:vl.CanSet() 是一個方法,用于確認vl的值是否可以被修改。在Go中,不是所有的反射值都能被設置,比如函數參數或者某些靜態類型就不能。如果vl的值可以被改變,CanSet()將返回true。		if vl.Kind() == reflect.Float32 || vl.Kind() == reflect.Float64 && vl.CanSet() {			vl.SetFloat(100.11) //調用vl.SetFloat(100.11)方法將變量vl的值設置為100.11。			fmt.Println("修改后float數值:", vl)		}	} else {		fmt.Println("結構體類型:", vlt, " 名字:", vlt.Name())		for i := 0; i < vl.NumField(); i++ {			//vl是具體的值,這里vl.Field(i)就是枚舉出每一個成員的值			//vlt是獲取的類型,vlt.Field(i).Name和.Type是枚舉出每一個成員的名字和類型			//也可以使用FieldByName,從指定的成員名獲取具體值,vlret:= vl.FieldByName(vlt.Field(i).Name)			fmt.Println("成員名:", vlt.Field(i).Name, " 類型:", vlt.Field(i).Type, " 數值:", vl.Field(i))			//如是字符串種類,又可以修改,CanSet屬性為true,則進行修改。			if vl.Field(i).Kind() == reflect.String && vl.Field(i).CanSet() {				vl.Field(i).SetString("new str")				fmt.Println("string成員修改后數值:", vl.Field(i))			}			//而tag標簽信息都是靜態的,無須實例化結構體,通過類型vlt可以獲取到。			//這句vlt.Field(i).Tag.Lookup("id")就是枚舉出每一個成員的tag標簽,看里面是否有id這個key,并返回它的value值			if idtag, b := vlt.Field(i).Tag.Lookup("id"); b {				fmt.Println("tag id=", idtag)			}			if numtag, b := vlt.Field(i).Tag.Lookup("num"); b {				fmt.Println("tag num=", numtag)			}		}	}}func main() {	var price float64 = 3.14	var age int64 = 5	bd := Userinfo{100, "andy"}	ns := struct { //定義一個無名結構體		id   int		addr string	}{2, "aa"}	GetReflickInfo(price)	GetReflickInfo(&age) //把變量地址傳遞,所以可以修改。	GetReflickInfo(&bd)  //把結構體地址傳遞,所以可以修改。	fmt.Println(bd)      //打印出修改后的結構體變量	GetReflickInfo(ns)}


gwF28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-87989-0.html一篇學會Go中reflect反射的詳細用法

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 深入理解分布式鎖:原理、應用與挑戰

下一篇: 一圖看懂 React 源碼中的同步更新邏輯

標簽:
  • 熱門焦點
  • 一加Ace2 Pro官宣:普及16G內存 引領24G

    一加官方今天繼續為本月發布的新機一加Ace2 Pro帶來預熱,公布了內存方面的信息。“淘汰 8GB ,12GB 起步,16GB 普及,24GB 引領,還有呢?#一加Ace2Pro#,2023 年 8 月,敬請期待。”同時
  • MIX Fold3包裝盒泄露 新機本月登場

    小米的全新折疊屏旗艦MIX Fold3將于本月發布,近日該機的真機包裝盒在網上泄露。從圖上來看,新的MIX Fold3包裝盒在外觀設計方面延續了之前的方案,變化不大,這也是目前小米旗艦
  • 俄羅斯:將審查iPhone等外國公司設備 保數據安全

    iPhone和特斯拉都屬于在各自領域領頭羊的品牌,推出的產品也也都是數一數二的,但對于一些國家而言,它們的產品可靠性和安全性還是在限制范圍內。近日,俄羅斯聯邦通信、信息技術
  • Redmi Buds 4開箱簡評:才199還有降噪 可以無腦入

    在上個月舉辦的Redmi Note11T Pro系列新機發布會上,除了兩款手機新品之外,Redmi還帶來了兩款TWS真無線藍牙耳機產品,Redmi Buds 4和Redmi Buds 4 Pro,此前我們在Redmi Note11T
  • 學習JavaScript的10個理由...

    作者 | Simplilearn編譯 | 王瑞平當你決心學習一門語言的時候,很難選擇到底應該學習哪一門,常用的語言有Python、Java、JavaScript、C/CPP、PHP、Swift、C#、Ruby、Objective-
  • 三言兩語說透柯里化和反柯里化

    JavaScript中的柯里化(Currying)和反柯里化(Uncurrying)是兩種很有用的技術,可以幫助我們寫出更加優雅、泛用的函數。本文將首先介紹柯里化和反柯里化的概念、實現原理和應用
  • 梁柱接棒兩年,騰訊音樂闖出新路子

    文丨田靜 出品丨牛刀財經(niudaocaijing)7月5日,企鵝FM發布官方公告稱由于業務調整,將于9月6日正式停止運營,這意味著騰訊音樂長音頻業務走向消亡。騰訊在長音頻領域還在摸索。為
  • 華為Mate60系列模具曝光:采用碩大圓形后置相機模組+拼接配色方案

    據此前多方爆料,今年華為將開始恢復一年雙旗艦戰略,除上半年推出的P60系列外,往年下半年的Mate系列也將迎來更新,有望在9-10月份帶來全新的華為Mate60
  • 北京:科技教育體驗基地開始登記

      北京“科技館之城”科技教育體驗基地登記和認證工作日前啟動。首批北京科技教育體驗基地擬于2023年全國科普日期間掛牌,后續還將開展常態化登記。  北京科技教育體驗基
Top 主站蜘蛛池模板: 禄丰县| 新闻| 伊吾县| 阿荣旗| 广东省| 大名县| 海口市| 尖扎县| 大同市| 金湖县| 菏泽市| 新平| 河曲县| 镇远县| 从江县| 璧山县| 松原市| 蒲城县| 黑龙江省| 读书| 北安市| 新宾| 资源县| 怀柔区| 宿松县| 巩留县| 长治市| 图木舒克市| 禄劝| 松桃| 满洲里市| 遂川县| 富平县| 东乡县| 阳新县| 青浦区| 霍林郭勒市| 武功县| 穆棱市| 科技| 旺苍县|