golang中通過反射獲取結構體Tag標簽定義的內容 函數和測試用例

當我們在go語言中定義結構體的時候, 經常需要給某些字段打上一個Tag標簽,? 如?Name string `json:"name"·` , 那這個標簽有和作用呢?? 這個作用可大了,最為常用的是json序列化和反序列化, 還有各種ORM 的實體對象定義,這個Tag可是必不可少的。 今天給大家介紹的這個函數就是用來獲取這個Tag中定義的值的函數, 廢話不多說,直接上代碼:

獲取結構體Struct標簽Tag的值函數GetStructTagVal

import ("fmt""reflect"
)// 獲取一個結構體TAG中的指定tagKey的值, 如果沒有對應的tagKey則返回空字符串和相應的錯誤信息
// structObj 結構體對象
// fieldName 結構體中定義的字段名稱 區分大小寫
// tagkey 結構體字段的Tag中定義的key,
//
//	    如: 結構體字段定義 Name string `json:"name" orm:"varchar(50) comment('名稱')"`
//		這里的tagKey就是 json 或者 orm
//		獲取到的值就是tagKey后面的雙引號內的值,如tagkey為 orm 獲取的值就是 varchar(50) comment('名稱')
//
// @author tekintian <tekintian@gmail.com>
func GetStructTagVal(structObj interface{}, fieldName, tagKey string) (string, error) {refType := reflect.TypeOf(structObj)if refType.Kind() != reflect.Struct { //傳入的數據非結構體類型,直接返回return "", fmt.Errorf("傳入參數 %v 的類型為 %T , 非結構體類型!", structObj, structObj)}if fieldObj, ok := refType.FieldByName(fieldName); ok {// 這里的sfield.Tag.Get(tagKey) 直接返回的是一個字符串if tagVal, isOk := fieldObj.Tag.Lookup(tagKey); isOk {return tagVal, nil} else {return "", fmt.Errorf("在結構體 %v 字段 %v 中未找到tagkey為 %v 的定義", refType.Name(), fieldName, tagKey)}}return "", fmt.Errorf("在結構體 %v 中未找到 %v 字段的定義", refType.Name(), fieldName)
}// 根據結構體StructField獲取tag標簽的值 沒有對應的tagkey將返回空字符串
//   - field: 通過反射獲取的字段對應的結構體字段對象 reflect.TypeOf(structObj).FieldByName(fieldName)
//   - tagKey: tag標簽的key
func GetStructTagValByStructField(fieldObj reflect.StructField, tagKey string) string {return fieldObj.Tag.Get(tagKey)
}

GetStructTagVal函數測試用例:

import ("testing"
)// GetStructTagVal單元測試用例
// @author tekintian <tekintian@gmail.com>
func TestGetStructTagVal(t *testing.T) {// 定義測試用例數據cases := []struct { // 測試用例輸入參數和期望輸出參數定義structObj anyfieldName stringtagkey    stringexpected  string // 預期結果}{{structObj: Person{}, fieldName: "Name", tagkey: "myorm", expected: "varchar(25) notnull unique 'usr_name' comment('姓名')"},{structObj: Person{}, fieldName: "age", tagkey: "json", expected: "age"},// 異常測試用例數據定義{structObj: Person{}, fieldName: "sex", tagkey: "json", expected: "在結構體 Person 中未找到 sex 字段的定義"},{structObj: Person{}, fieldName: "age", tagkey: "json1", expected: "在結構體 Person 字段 age 中未找到tagkey為 json1 的定義"},{structObj: 123, fieldName: "x", tagkey: "y", expected: "傳入參數 123 的類型為 int , 非結構體類型!"}, // 這個直接就返回異常了}for _, v := range cases {t.Run(v.fieldName, func(t *testing.T) {tagVal, err := GetStructTagVal(v.structObj, v.fieldName, v.tagkey)// 這里如果異常信息不為空,且異常信息 等于期望的異常 或者 輸出結果等于期望結果 測試成功if (err != nil && err.Error() == v.expected) || tagVal == v.expected {t.Log(tagVal) // 測試通過,打印日志信息} else {// 測試失敗的情況// 有異常且是非期望的異常if err != nil {t.Fatal(err) // 測試失敗,打印異常信息} else {// 結果不等于預期 測試失敗t.Fatalf("test failed, expected '%v', got '%v'", v.expected, tagVal)}}})}
}

參考?reflect package - reflect - Go Packages

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/20251.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/20251.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/20251.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C# yolov8 TensorRT +ByteTrack Demo

C# yolov8 TensorRT ByteTrack Demo 目錄 效果 說明 項目 代碼 Form2.cs YoloV8.cs ByteTracker.cs 下載 參考 效果 說明 環境 NVIDIA GeForce RTX 4060 Laptop GPU cuda12.1cudnn 8.8.1TensorRT-8.6.1.6 版本和我不一致的需要重新編譯TensorRtExtern.dll&…

微調醫療大模型,與通用大模型效果對比

下面是一份CT描述&#xff1a; “肝臟大小、形態未見明確異常。肝S2見一結節狀低密度影&#xff0c;大小約13x11mm&#xff0c;增強掃描呈明顯漸進性強化&#xff0c;延遲期呈等密度。余肝實質內未見異常密度影或強化灶。肝內大血管及其分支走行未見異常&#xff0c;肝門區層次…

ip地址告訴別人安全嗎?ip地址告訴別人會有什么風險

IP地址告訴別人安全嗎&#xff1f;在數字化時代&#xff0c;IP地址作為網絡連接的關鍵標識符&#xff0c;承載著重要的安全意義。然而&#xff0c;很多人可能并不清楚&#xff0c;輕易地將自己的IP地址告訴他人可能帶來一系列安全風險。那么&#xff0c;IP地址告訴別人會有什么…

文件夾損壞0字節:全面解析、恢復技巧與預防策略

在數字時代&#xff0c;數據的完整性和安全性至關重要。然而&#xff0c;我們時常會遭遇文件夾損壞并顯示為0字節的棘手問題。這種情況一旦發生&#xff0c;用戶可能會面臨數據丟失的風險。本文將詳細探討文件夾損壞0字節的現象&#xff0c;分析其背后的原因&#xff0c;并提供…

Redis-重定向

實驗環境&#xff08;3主3從的Redis-Cluster&#xff09; 一、Redis重定向基礎篇 1、MOVED重定向 Redis Custer 中&#xff0c;客戶端可以向集群中任意節點發送請求。此時當前節點先對 Key 進行 CRC 16 計算&#xff0c;然后按 16384 取模確定 Slot 槽。確定該 Slot 槽所對應的…

為什么使用短鏈系統?

短鏈接&#xff08;Short Link&#xff09;是指將一個原始的長 URL&#xff08;Uniform Resource Locator&#xff09;通過特定的算法或服務轉化為一個更短、易于記憶的 URL。短鏈接通常只包含幾個字符&#xff0c;而原始的長 URL 可能會非常長。 短鏈接的原理非常簡單&#x…

FPGA編程與PLC編程的區別:深入解析與對比

FPGA編程與PLC編程的區別&#xff1a;深入解析與對比 在工業自動化和控制系統領域&#xff0c;FPGA&#xff08;現場可編程門陣列&#xff09;編程和PLC&#xff08;可編程邏輯控制器&#xff09;編程都是關鍵的編程技術&#xff0c;但它們在應用、功能、結構和編程方法上存在…

IEEE編程語言排行榜:深度解析編程語言的四大維度、五大趨勢、六大熱門與七大挑戰

IEEE編程語言排行榜&#xff1a;深度解析編程語言的四大維度、五大趨勢、六大熱門與七大挑戰 在信息技術領域&#xff0c;編程語言排行榜一直是衡量各種編程語言流行度和影響力的重要指標。IEEE&#xff08;電氣電子工程師協會&#xff09;作為全球最具影響力的科技專業組織之…

【Java數據結構】詳解LinkedList與鏈表(二)

目錄 1.????前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; 2.反轉一個單鏈表 3. 找到鏈表的中間節點 4.輸入一個鏈表&#xff0c;輸出該鏈表中倒數第k個結點。 5.合并兩個有序鏈表 6.鏈表分割 7. 判定鏈表的回文結構 8.輸入兩個鏈表&#xff0c;找…

棧與隊列練習題(2024/5/31)

1有效的括號 給定一個只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判斷字符串是否有效。 有效字符串需滿足&#xff1a; 左括號必須用相同類型的右括號閉合。左括號必須以正確的順序閉合。每個右括號都有一個對應的…

云服務和云備份的區別是什么?

隨著云計算的興起&#xff0c;云備份與云服務被越來越多的企業和個人所關注&#xff0c;在云計算中云服務與云備份之間還是有一定的區別的&#xff0c;本文就來介紹一下云服務和云備份之間的區別。 云服務和云備份主要的區別在備份對象、推薦場景和數據一致性等方面。 備份對象…

打印機的ip不同且連不上

打印機的ip不同且連不上 1.問題分析2.修改網段3.驗證網絡 1.問題分析 主要是打印機的網段和電腦不在同一個網段 2.修改網段 3.驗證網絡

Web前端三大主流框:React、Vue 和 Angular

在當今快速發展的 Web 開發領域&#xff0c;選擇合適的前端框架對于項目的成功至關重要。React、Vue 和 Angular 作為三大主流前端框架&#xff0c;憑借其強大的功能和靈活的特性&#xff0c;贏得了眾多開發者的青睞。本文將對這三大框架進行解析&#xff0c;幫助開發者了解它們…

dubbo復習:(12)服務器端的異步和客戶端的異步調用

一、服務器端接口的定義和實現&#xff1a; package cn.edu.tju.service;import java.util.concurrent.CompletableFuture;public interface AsyncService {/*** 同步調用方法*/String invoke(String param);/*** 異步調用方法*/CompletableFuture<String> asyncInvoke(…

C/C++學習筆記 C讀取文本文件

1、簡述 要讀取文本文件&#xff0c;需要按照以下步驟操作&#xff1a; 首先&#xff0c;使用該函數打開文本文件fopen()。其次&#xff0c;使用fgets()或fgetc()函數從文件中讀取文本。第三&#xff0c;使用函數關閉文件fclose()。 2、每次從文件中讀取一個字符 要從文本文…

整理一下win7系統java、python等各個可安裝版本

最近使用win7系統&#xff0c;遇到了很多版本不兼容的問題&#xff0c;把我現在安裝好的可使用的分享給大家 jdk 1.8 maven-3.9.6 centos 7 python 3.7.4 docker DockerToolbox-18.01.0-ce win10是直接一個docker軟件&#xff0c;win7要安裝這三個 datagrip-2020.2.3 d…

2.1Docker安裝MySQL8.0

2.1 Docker安裝MySQL8.0 1.拉取MySQL docker pull mysql:latest如&#xff1a;拉取MySQL8.0.33版本 docker pull mysql:8.0.332. 啟動鏡像 docker run -p 3307:3306 --name mysql8 -e MYSQL_ROOT_PASSWORDHgh75667% -d mysql:8.0.33-p 3307:3306 把mysql默認的3306端口映射…

CentOs-7.5 root密碼忘記了,如何重置密碼?

VWmare軟件版本&#xff1a;VMware Workstation 16 Pro Centos系統版本&#xff1a;CentOS-7.5-x86 64-Minimal-1804 文章目錄 問題描述如何解決&#xff1f; 問題描述 長時間沒有使用Linux系統&#xff0c;root用戶密碼忘記了&#xff0c;登陸不上系統&#xff0c;如下圖所示…

【網絡安全】Web安全基礎 - 第一節:使用軟件及環境介紹

VMware VMware&#xff0c;是全球云基礎架構和移動商務解決方案的佼佼者。 VMware可是一個總部位于美國加州帕洛阿爾托的計算機虛擬化軟件研發與銷售企業呢。簡單來說&#xff0c;它就是通過提供虛擬化解決方案&#xff0c;讓企業在數據中心改造和公有云整合業務上更加得心應…

QImage和QPixmap的區別和使用

一、基本概念和特點 QImage 概念&#xff1a;QImage是Qt庫中用于處理圖像數據的一個類。它提供了直接訪問和操作圖像像素的接口。特點&#xff1a; 可以獨立于屏幕分辨率和設備處理圖像。支持讀取和保存多種圖像格式&#xff0c;如PNG、JPEG、BMP等。可以在沒有圖形界面的情況…