<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Golang基礎(chǔ)筆記十六之反射

      本文首發(fā)于公眾號:Hunter后端

      原文鏈接:Golang基礎(chǔ)筆記十六之反射

      反射可以用于程序在運行時檢查、修改自身類型和值,主要通過 reflect 包實現(xiàn)。

      首先,我們提出一個需求,要打印出一個結(jié)構(gòu)體 struct 的各個字段及其對應(yīng)的標簽數(shù)據(jù),按照當(dāng)前的筆記內(nèi)容是無法解決該問題的,但是我們可以使用反射操作來完成。

      以下是本篇筆記目錄:

      1. 變量的類型和值
      2. 修改變量的值
      3. 遍歷結(jié)構(gòu)體字段
      4. 動態(tài)調(diào)用函數(shù)

      1、變量的類型和值

      先引入 reflect 模塊:

      import (
          "reflect"
      )
      

      我們可以通過 reflect.TypeOf() 獲取變量的類型:

      var x float64 = 3.5
      
      t := reflect.TypeOf(x)
      

      返回的 t 是 Type 接口,我們可以進一步調(diào)用 t 的方法來獲取類型信息:

      // 變量的類型名稱:
      fmt.Println("x 的類型名稱是: ", t.Name())
      
      // 判斷類型的類別:
      fmt.Println("x 的類型是否是 float64: ", t.Kind() == reflect.Float64)
      

      獲取變量的值信息:

      v := reflect.ValueOf(x)
      fmt.Println("value: ", v.Float() == 3.5)
      

      2、修改變量的值

      如果要修改這個變量的值,我們需要用到指針,以下是操作示例:

      var x float64 = 3.5
      
      // 這里獲取的是變量的地址的值,如果直接 reflect.ValueOf(x) 獲取的是 x 的副本
      p := reflect.ValueOf(&x)
      
      // Elem() 方法獲取指針指向的實際值,是解引用的操作
      v := p.Elem()
      
      // 重新賦值的操作
      v.SetFloat(4.9)
      fmt.Println("new value: ", x)
      

      3、遍歷結(jié)構(gòu)體字段

      我們先定義一個結(jié)構(gòu)體如下:

      type Person struct {
      	Id   int    `json:"id" form:"id"`
      	Name string `json:"name"`
      }
      

      打印一個 Person 示例各個字段的名稱及其值的操作如下:

      p := Person{
          Id:   1,
          Name: "hunter",
      }
      t := reflect.TypeOf(p)
      v := reflect.ValueOf(p)
      
      for i := 0; i < t.NumField(); i++ {
          field := t.Field(i)
          value := v.Field(i)
      
          fmt.Printf("field_name:%s, field_type:%s, value:%v\n", field.Name, field.Type, value.Interface())
      }
      

      在這里,我們通過 t.NumField() 方法獲取到 p 的字段個數(shù),并使用 t.Field(i)v.Field(i) 獲取到對應(yīng)字段類型和值。

      接著對于每個 field 和 value,我們可以打印出對應(yīng)的字段名稱,字段類型和值。

      我們還可以使用 field.Tag.Get() 的方式獲取到字段標簽的值:

      fmt.Printf("json_tag:%s, form_tag:%s\n", field.Tag.Get("json"), field.Tag.Get("form"))
      

      如果后續(xù)我們介紹 Golang 的 validator 模塊,可以了解到,validator 就是通過 struct 定義的標簽使用反射來對字段值進行驗證的。

      4、動態(tài)調(diào)用函數(shù)

      我們還可以使用反射來動態(tài)調(diào)用函數(shù),比如某個函數(shù)如下:

      func Add(a, b int) int {
          return a + b
      }
      

      使用反射動態(tài)調(diào)用的操作如下:

      func main() {
          targetFunc := reflect.ValueOf(Add)
      
          args := []reflect.Value{reflect.ValueOf(2), reflect.ValueOf(5)}
      
          result := targetFunc.Call(args)
          fmt.Println("動態(tài)調(diào)用 Add 函數(shù),result: ", result[0].Int())
      }
      

      注意:雖然反射可以為我們提供一些便利的操作,但是代碼的可讀性和可維護性會降低,且會降低性能,需要在實際生產(chǎn)中謹慎使用。

      posted @ 2025-07-30 22:10  XHunter  閱讀(353)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 91精品亚洲一区二区三区| 欧美自拍嘿咻内射在线观看| 丝袜美腿视频一区二区三区| 亚洲熟女乱色一区二区三区| 亚洲中文字幕日产无码成人片| 国产午夜福利视频在线| 在线观看国产成人av天堂| 亚洲欧美日韩成人综合一区 | 中文字幕在线视频不卡一区二区 | 久久天天躁夜夜躁狠狠综合| 亚洲a免费| 性男女做视频观看网站| 中文人妻av高清一区二区| 产综合无码一区| av 日韩 人妻 黑人 综合 无码| 小婕子伦流澡到高潮h| 日韩中文字幕亚洲精品一| 日韩在线视频线观看一区| 潮喷无码正在播放| 日本成熟少妇喷浆视频| 欧美精品在线观看视频| 无码人妻丰满熟妇区毛片| 亚洲精品一区二区三区综合| 日本精品不卡一二三区| 加勒比中文字幕无码一区| 亚洲激情av一区二区三区| 久久96热在精品国产高清| 亚洲一区成人av在线| 国产超碰人人做人人爱| 黄色A级国产免费大片视频| 强奷乱码欧妇女中文字幕熟女| 米奇亚洲国产精品思久久| 绩溪县| 日韩一区二区三区在线观院| 国产成人亚洲日韩欧美| 野外做受三级视频| 亚洲国产精品第一二三区| 久久香蕉欧美精品| 亚洲国产欧美日韩另类| 少妇高潮喷水正在播放| 少妇被无套内谢免费看|