go的反射和斷言

在go中對于一個變量,主要包含兩個信息變量類型(type)和變量值(value)
可以通過reflect包在運行的時候動態獲取變量信息,并能夠進行操作

對于Type可以通過reflect.TypeOf()獲取到變量的類型信息

reflect.TypeOf()返回的是一個Type類型,里面保存了類型的信息

通過reflect.ValueOf()來獲取到變量的值部分

reflect.ValueOf()返回的是一個Value類型

可以通過Value.Kind()獲取到該變量大概的類型

go中的斷言可以將一個未知的類型轉換為指定的類型

通過結合反射和斷言,我們可以實現這樣的一個功能

// UpdateFieldMap 獲取更新字段鍵值對,除了在empty記錄的字段整數類型為0或者string類型為空默認不更新
func UpdateFieldMap(in any, empty map[string]struct{}) map[string]any {out := make(map[string]any)if empty == nil {empty = make(map[string]struct{})}v := reflect.ValueOf(in)if v.Kind() == reflect.Ptr {v = v.Elem()}if v.Kind() != reflect.Struct {panic(fmt.Errorf("ToMap only accepts structs; got %T", v))}typ := v.Type()for i := 0; i < v.NumField(); i++ {// 獲取字段的值fieldValue := v.Field(i)// 獲取字段的類型//fieldType := fieldValue.Type()columns := strings.Split(typ.Field(i).Tag.Get("gorm"), ";")column := ""for _, s := range columns {if strings.HasPrefix(s, "column:") {column = s[7:]}}switch fieldValue.Kind() {case reflect.Int://fmt.Println(column, fieldValue.Interface().(int))val := fieldValue.Interface().(int)_, ok := empty[column]if val != 0 || ok {out[column] = val}case reflect.String:val := fieldValue.Interface().(string)_, ok := empty[column]if val != "" || ok {out[column] = val}case reflect.Struct:if fieldValue.Type() == reflect.TypeOf(time.Time{}) {// 處理 time.Time 類型val := fieldValue.Interface().(time.Time)_, ok := empty[column]if !val.IsZero() || ok {out[column] = val}}}}return out}

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

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

相關文章

13_前端工程化_ES6

1.前端工程化概念 前端工程化是使用軟件工程的方法來單獨解決前端的開發流程中模塊化、組件化、規范化、自動化的問題,其主要目的為了提高效率和降低成本。 前后端分離&#xff08;前端代碼工程化獨立出來形成一個單獨的app&#xff09; 1.開發分離 2.部署分離 3.服務器分離…

信號(上)

本節目標&#xff1a; 1. 掌握Linux信號的基本概念 2. 掌握信號產生的一般方式 3. 理解信號遞達和阻塞的概念&#xff0c;原理。 4. 掌握信號捕捉的一般方式。 5. 重新了解可重入函數的概念。 6. 了解競態條件的情景和處理方式 7. 了解SIGCHLD信號&#xff0c; 重新編寫信號處理…

ChatGPT基本原理詳細解說

ChatGPT基本原理詳細解說 引言 在人工智能領域&#xff0c;自然語言處理&#xff08;NLP&#xff09;一直是研究的熱點之一。隨著技術的發展&#xff0c;我們見證了從簡單的聊天機器人到復雜的語言模型的演變。其中&#xff0c;ChatGPT作為一項突破性技術&#xff0c;以其強大…

【Vue】自定義指令-v-loading指令的封裝

場景 實際開發過程中&#xff0c;發送請求需要時間&#xff0c;在請求的數據未回來時&#xff0c;頁面會處于空白狀態 > 用戶體驗不好 需求 封裝一個 v-loading 指令&#xff0c;實現加載中的效果 分析 本質 loading效果就是一個蒙層&#xff0c;蓋在了盒子上 數據請求…

從零開始精通Onvif之設備發現

設備發現的意義 在復雜的網絡環境中&#xff0c;如何快速而準確地識別網絡上的Onvif設備&#xff0c;對于攝像頭廠商、系統集成商、開發人員乃至最終用戶來說&#xff0c;都顯得至關重要。 首先&#xff0c;設備發現有效簡化了集成的復雜度。在沒有統一標準之前&#xff0c;每個…

2004NOIP普及組真題 2. 花生采摘

線上OJ&#xff1a; 【04NOIP普及組】花生采摘 核心思想&#xff1a; 1、本題為貪心即可。 2、因為本題嚴格限制了順序&#xff0c;所以先把每個節點的花生數量按降序排序。然后逐一判斷下一個花生是否需要去采摘即可 3、每一次采摘完&#xff0c;記錄耗時 t 以及采集的花…

力扣第417題測試程序

題目描述&#xff1a; 有一個 m n 的矩形島嶼&#xff0c;與 太平洋 和 大西洋 相鄰。 “太平洋” 處于大陸的左邊界和上邊界&#xff0c;而 “大西洋” 處于大陸的右邊界和下邊界。 這個島被分割成一個由若干方形單元格組成的網格。給定一個 m x n 的整數矩陣 heights &#…

基于web的垃圾分類回收系統的設計

管理員賬戶功能包括&#xff1a;系統首頁&#xff0c;個人中心&#xff0c;管理員管理&#xff0c;用戶管理&#xff0c;公告管理&#xff0c;運輸管理&#xff0c;基礎數據管理 用戶賬戶功能包括&#xff1a;系統首頁&#xff0c;個人中心&#xff0c;運輸管理&#xff0c;公告…

pyqt QlineEdit內部增加按鈕方法

pyqt QlineEdit內部增加按鈕方法 def addButton(self,lineEdit):btn QtWidgets.QPushButton("")icon1 QtGui.QIcon()icon1.addPixmap(QtGui.QPixmap(":/image/images/th.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)btn.setIcon(icon1)btn.setStyleShe…

全光譜led燈的危害有哪些?曝光低質量全光譜led燈產生的四大風險

眼睛是人類獲取信息最重要的感官器官之一&#xff0c;而近視則會導致視力模糊&#xff0c;進而影響學習效果和生活品質。因此&#xff0c;如何保護眼睛&#xff0c;尤其是在學習和使用電子設備時&#xff0c;成為了一個迫切需要解決的問題。然而在護眼領域上&#xff0c;護眼臺…

【DevOps】網絡安全進階之路:打造更安全、更可靠的網站

目錄 一、網站面臨的主要安全威脅 1、SQL注入攻擊 2、跨站腳本攻擊(XSS) 3、跨站請求偽造(CSRF) 4、文件上傳漏洞 5、不安全的直接對象引用 6、安全配置錯誤 7、使用含有已知漏洞的組件 二、網站安全防護措施 1、輸入驗證與過濾 2、使用參數化查詢 3、數據輸出編碼…

SCAU 數據結構 實驗六 排序算法

![[Pasted image 20240 8638 直接插入排序 Description 用函數實現直接插入排序&#xff0c;并輸出每趟排序的結果. 輸入格式 第一行&#xff1a;鍵盤輸入待排序關鍵的個數n 第二行&#xff1a;輸入n個待排序關鍵字&#xff0c;用空格分隔數據 輸出格式 每行輸出一趟排序…

掌握Java設計模式的23種武器(全):深入解析與實戰示例

目錄 一、創建型模式 1. 單例模式 (Singleton Pattern) 2. 工廠模式 (Factory Pattern) 3. 抽象工廠模式 (Abstract Factory Pattern) 4. 建造者模式 (Builder Pattern) 5. 原型模式 (Prototype Pattern) 二、結構型模式 6. 適配器模式 (Adapter Pattern) 7. 橋接模式…

通信的本質是什么

通信的本質是信息的傳遞和交換。在通信過程中&#xff0c;信息從一個主體&#xff08;發送方&#xff09;傳遞到另一個主體&#xff08;接收方&#xff09;&#xff0c;目的是使接收方理解或使用發送方傳遞的信息。無論使用什么樣的媒介或技術&#xff0c;通信的核心都是在不同…

十三、resultMap解析

分為兩部分&#xff1a;解析和使用 解析 1.解析XML的時候單獨解析所有的resultMap標簽&#xff0c;封裝成ResultMap對象存入configuration中 2.解析XML中的SQL語句&#xff0c;封裝MappedStatement對象&#xff0c;這里會根據SQL的返回類型是resultMap還是resultType做處理。如…

C語言 | Leetcode C語言題解之第133題克隆圖

題目&#xff1a; 題解&#xff1a; struct Node** visited; int* state; //數組存放結點狀態 0&#xff1a;結點未創建 1&#xff1a;僅創建結點 2&#xff1a;結點已創建并已填入所有內容void bfs(struct Node* s) {if (visited[s->val] && state[s->val] 2…

【嵌入式系統實踐】實驗三EXTI按鈕外部中斷控制LED燈參考代碼

此內容不屬于實驗內容&#xff0c;因自己手頭有一STM32F103&#xff0c;故驗證性的進行代碼實驗&#xff0c;按照老師課堂ppt進行了一下復現。 通過按鈕控制LED燈的亮滅(狀態取反)。 main.c代碼&#xff1a; #include "STM32F10X.h" #include "stdio.h"…

Open3D Guided濾波(Python版本)

文章目錄 一、簡介二、實現代碼三、實現效果參考資料一、簡介 Guided Filter原本主要用于2D圖像的降噪等處理,但經過適當的修改后,它可以有效地應用于3D點云的降噪。這種方法能夠保留點云中的細節信息,并且對邊緣和曲面進行保護。 其具體計算過程如下所述: 1.局部線性假設:…

Python Lambda函數的應用實例教程

在Python編程中&#xff0c;lambda函數是一種簡潔且強大的工具&#xff0c;用于創建小型匿名函數。它們在需要快速定義簡單函數時特別有用。本文將詳細介紹lambda函數的語法及其多種應用實例&#xff0c;幫助讀者更好地理解和使用lambda函數。 一、lambda函數的基本概念 1.1 什…

c++(內存分配,構造,析構)

#include <iostream>using namespace std; class Per { private:string name;int age;double *height;double *weigh; public://無參構造Per(){cout << "Per::無參構造" << endl;}//有參構造Per(string name,int age,double height,double weigh):…