日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

go byte转uint_面试官问我go反射,我怀疑他让我写ORM框架

發布時間:2024/9/19 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 go byte转uint_面试官问我go反射,我怀疑他让我写ORM框架 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

該文章始發于公眾號【邁莫coding】

地址:https://mp.weixin.qq.com/s/lgZykTL8ls6aG0OMNSbZMw

目錄

  • 概念
  • ValueOf使用格式
  • 反射獲取值對象(ValueOf)
  • 通過canSet方法修改值
    • 判斷及獲取元素的相關方法
    • 值修改相關方法
    • 值修改條件:可尋址
    • 結構體值的非導出字段不能通過反射來修改
  • 通過ValueOf訪問成員對象
  • 閑聊
  • 歡迎加入我的公眾號【邁莫coding】 一起pk大廠

概念

在程序運行期間,如果想要獲取某個接口所代表的值,那么可以使用 reflect.ValueOf 進行獲取,使用方式和 reflect.TypeOf 函數使用方式類型,都是傳入一個interface{}接口的參數。當我們將一個接口值傳遞給一個 reflect.ValueOf 調用時,此調用返回的是代表著此接口值的動態值的一個reflect.Value值。 我們必須通過間接的途徑獲得一個代表一個接口值的 reflect.Value 值。

ValueOf使用格式

當調用 reflect.ValueOf 函數時,他會返回一個 reflect.Value 對象,如果我們想要獲取原值,則可通過具體方法來進行獲取,具體方法如下:

方法名說 明
Interface()將值以 interface{} 類型返回,可以通過類型斷言轉換為指定類型
Int() int64將值以 int 類型返回,所有有符號整型均可以此方式返回
Uint() uint64將值以 uint 類型返回,所有無符號整型均可以此方式返回
Float() float64將值以雙精度(float64)類型返回,所有浮點數(float32、float64)均可以此方式返回
Bool() bool將值以 bool 類型返回
Bytes() []bytes將值以字節數組 []bytes 類型返回
String() string將值以字符串類型返回

演示

package mainimport ("fmt""reflect" )func main() {var a int = 56value := reflect.ValueOf(a)fmt.Println(value.Interface())fmt.Println(value.Interface().(int))

結果:

56

代碼說明:

- 第9行:定義變量a并賦值為56 - 第10行:通過reflect.ValueOf函數獲取值對象 - 第11行:獲取值對象的原型值 - 第12行:通過斷言獲取原型值

通過ValueOf訪問成員對象

反射值對象(reflect.Value)提供對結構體訪問的方法,通過這些方法可以完成對結構體任意值的訪問,如下表所示。

方 法備 注
Field(i int) Value根據索引,返回索引對應的結構體成員字段的反射值對象。當值不是結構體或索引超界時發生宕機
NumField() int返回結構體成員字段數量。當值不是結構體或索引超界時發生宕機
FieldByName(name string) Value根據給定字符串返回字符串對應的結構體字段。沒有找到時返回零值,當值不是結構體或索引超界時發生宕機
FieldByIndex(index []int) Value多層成員訪問時,根據 []int 提供的每個結構體的字段索引,返回字段的值。 沒有找到時返回零值,當值不是結構體或索引超界時發生宕機
FieldByNameFunc(match func(string) bool) Value根據匹配函數匹配需要的字段。找到時返回零值,當值不是結構體或索引超界時發生宕機

演示

package mainimport ("fmt""reflect" )type Turbo struct {Name stringAge int }func main() {turbo := &Turbo{Name: "邁莫coding",Age: 1,}value := reflect.ValueOf(turbo)if value.Kind() == reflect.Ptr {value = value.Elem()for i := 0; i < value.NumField(); i++ {field := value.Field(i)fmt.Printf("字段類型:%v, 字段值:%vn", field.Type(), field.Interface())}st := value.FieldByName("Name")fmt.Printf("%vn", st.Interface())}

結果:

字段類型:string, 字段值:邁莫coding 字段類型:int, 字段值:1 邁莫coding

代碼說明:

- 第8行:定義結構體Turbo - 第14行:初始化Turbo結構體對象 - 第18行:通過reflect.ValueOf函數獲取Value對象 - 第19行:判斷反射類型對象種類是否為指針 - 第20行:獲取指針指向的元素 - 第21行:遍歷循環結構體中的字段屬性 - 第22行:獲取某個字段屬性的Value對象 - 第23行:獲取某個字段類型和字段原值

通過canSet方法修改值

一個 reflect.Value 值的 CanSet 方法將返回此 reflect.Value 值代表的Go值是否可以被修改(可以被賦值)。 如果一個Go值可以被修改,則我們可以調用對應的 reflect.Value 值的Set方法來修改此Go值。 注意: reflect.ValueOf 函數直接返回的 reflect.Value 值都是不可修改的。

判定及獲取元素的相關方法

使用 reflect.Value 取元素、取地址及修改值的屬性方法請參考下表。

方法名備 注
Elem() Value取值指向的元素值,類似于語言層*操作。當值類型不是指針或接口時發生宕 機,空指針時返回 nil 的 Value
Addr() Value對可尋址的值返回其地址,類似于語言層&操作。當值不可尋址時發生宕機
CanAddr() bool表示值是否可尋址
CanSet() bool返回值能否被修改。要求值可尋址且是導出的字段

值修改相關方法

使用 reflect.Value 修改值的相關方法如下表所示。

Set(x Value)將值設置為傳入的反射值對象的值
Setlnt(x int64)使用 int64 設置值。當值的類型不是 int、int8、int16、 int32、int64 時會發生宕機
SetUint(x uint64)使用 uint64 設置值。當值的類型不是 uint、uint8、uint16、uint32、uint64 時會發生宕機
SetFloat(x float64)使用 float64 設置值。當值的類型不是 float32、float64 時會發生宕機
SetBool(x bool)使用 bool 設置值。當值的類型不是 bod 時會發生宕機
SetBytes(x []byte)設置字節數組 []bytes值。當值的類型不是 []byte 時會發生宕機
SetString(x string)設置字符串值。當值的類型不是 string 時會發生宕機

值修改條件:可尋址

通過反射修改變量值的前提條件之一:這個值必須可以被尋址。簡單地說就是這個變量必須能被修改。

  • 可尋址,可被修改
package mainimport ("fmt""reflect" )func main() {n := "邁莫coding"str := &nvalue := reflect.ValueOf(str)fmt.Printf("返回值是否被修改?%v, n表示值是否可尋址?%vn", value.CanSet(), value.CanAddr())vn := value.Elem()fmt.Printf("返回值是否被修改?%v, n表示值是否可尋址?%vn", value.CanSet(), value.CanAddr())vn.Set(reflect.ValueOf("邁莫coding正式運營一個月"))fmt.Println(n)

結果:

返回值是否被修改?false, 表示值是否可尋址?false 返回值是否被修改?false, 表示值是否可尋址?false 邁莫coding正式運營一個月

代碼說明:

- 第9行:定義字符串n - 第11行:通過reflect.ValueOf函數獲取Value對象 - 第13行:取得vp的底層指針值引用的值的代表值 - 第15行:通過set()方法設置新值
  • 非指針地址數據不可被修改
package mainimport ("fmt""reflect" )func main() {var a int = 666value := reflect.ValueOf(a)value.SetInt(888)fmt.Println(a)

結果:

panic: reflect: reflect.Value.SetInt using unaddressable value

通過反射對非指針數據進行修改時,會拋出異常。

結構體值的非導出字段不能通過反射來修改

package mainimport ("fmt""reflect" )type Turbo struct {Name interface{}age interface{} } func main() {vs := reflect.ValueOf(&Turbo{})vs = reflect.Indirect(vs)vx, vy := vs.Field(0), vs.Field(1)fmt.Println(vx.CanSet(), vx.CanAddr())fmt.Println(vy.CanSet(), vy.CanAddr())vb := reflect.ValueOf(123)vx.Set(vb)vy.Set(vb) // 會造成恐慌,因為vy代表的值是不可修改的。fmt.Println(vx.IsNil(), vy.IsNil())

結果:

true true false true panic: reflect: reflect.Value.Set using value obtained using unexported field false true

代碼說明:

- 第8行:定義一個結構體類型Turbo - 第14行:如果vs代表著一個指針,下一行等價于"vs := vs.Elem()" - 第15行:分別取出結構體對象中的字段屬性值 - 第17行:vy為是地址類型但不可被修改 - 第19行:判斷vx,vy是否為空值 - 第20行:vx代表的值是可修改的,可暴露的字段 - 第21行:vy代表的值是不可修改的,會Panic異常

閑聊

  • 讀完文章,自己是不是和反射的cp率又提高了
  • 我是邁莫,歡迎大家和我交流
覺得文章寫得不錯的小伙伴,點個贊 鼓勵一下吧~

歡迎加入我的公眾號【邁莫coding】 一起pk大廠

  • 邁莫coding歡迎客官的到來

總結

以上是生活随笔為你收集整理的go byte转uint_面试官问我go反射,我怀疑他让我写ORM框架的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产孕妇孕交大片孕 | 国产欧美精品一区二区色综合 | 亚洲图片 自拍偷拍 | 五月婷婷丁香花 | 一区二区三区视频在线 | 国产农村妇女精品一二区 | 六月综合| 亚洲四区在线 | 欧美黑人xxx | 碰超在线| 免费看黄禁片 | 自拍偷拍在线播放 | 国产精品一区在线免费观看 | 三上悠亚 电影 | 激情综合影院 | 一级a性色生活片久久毛片 爱爱高潮视频 | 欧美性大战久久久 | 三级网站在线免费观看 | 欧美有码在线观看 | 美女被出白浆 | 国产高清视频一区二区 | 二级黄色大片 | 亚洲成人 av | 亚洲乱码av| 男人的天堂2019 | 视频在线免费观看 | 久久婷婷六月 | 日韩另类av | 国产精品国产三级国产三级人妇 | 国产乱子伦农村叉叉叉 | 国产777| 手机在线免费观看av | 激情网色 | 免费视频黄色 | 快色av| 成人黄色免费在线观看 | 视频二区中文字幕 | 久久春色 | 日韩91精品 | 欧洲国产视频 | 制服诱惑一区二区三区 | 欧美精品一区二区三区三州 | 九色视频网 | 一级日批片 | 人禽高h交 | 人人爽人人爽人人 | 清清草视频 | 一区二区三区av夏目彩春 | 欧美性色19p | 精品国产精品网麻豆系列 | 成人av高清在线 | 成人av资源网 | 色中色综合 | 青久草视频| 欧美成人三级在线观看 | 日本成人不卡 | 蜜臀av一区二区三区激情综合 | 无遮挡又爽又刺激的视频 | 成年人看的视频网站 | 国产一级片网站 | 欧美日韩在线观看一区二区 | 久久久久亚洲无码 | 欧美午夜精品一区二区 | 亚洲精品日韩在线 | 亚洲αv | 猛1被调教成公厕尿便失禁网站 | 成人午夜免费在线 | 欧美日韩乱国产 | 粉嫩av一区 | 国产女人18毛片水真多18 | 男人激烈吮乳吃奶爽文 | 美女综合网 | 91中文国产| 91亚洲国产成人久久精品麻豆 | 亚洲成av人片一区二区梦乃 | 兄弟兄弟全集免费观看 | 亚洲成年| 国产天堂久久 | av鲁丝一区二区鲁丝 | 色吊丝av中文字幕 | 国产美女永久免费 | 国内毛片视频 | 无码人妻精品一区二区中文 | 黄色在线视频播放 | 日日摸日日| 久久久亚洲成人 | ww成人 | 福利视频免费 | 乌克兰av在线 | 在线综合网 | 色久av| 性欧美18—19sex性高清 | 亚洲精品白浆 | 亚洲人成电影在线播放 | 天天综合天天做天天综合 | 亚洲成av人片 | 国产精品一区二区免费 | 看黄色一级大片 | 国产一卡在线 |