码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • go的反射和断言


    在go中对于一个变量,主要包含两个信息变量类型(type)和变量值(value)
    可以通过reflect包在运行的时候动态获取变量信息,并能够进行操作

    对于Type可以通过reflect.TypeOf()获取到变量的类型信息

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

    通过reflect.ValueOf()来获取到变量的值部分

    reflect.ValueOf()返回的是一个Value类型

    可以通过Value.Kind()获取到该变量大概的类型

    go中的断言可以将一个未知的类型转换为指定的类型

    通过结合反射和断言,我们可以实现这样的一个功能

    1. // UpdateFieldMap 获取更新字段键值对,除了在empty记录的字段整数类型为0或者string类型为空默认不更新
    2. func UpdateFieldMap(in any, empty map[string]struct{}) map[string]any {
    3. out := make(map[string]any)
    4. if empty == nil {
    5. empty = make(map[string]struct{})
    6. }
    7. v := reflect.ValueOf(in)
    8. if v.Kind() == reflect.Ptr {
    9. v = v.Elem()
    10. }
    11. if v.Kind() != reflect.Struct {
    12. panic(fmt.Errorf("ToMap only accepts structs; got %T", v))
    13. }
    14. typ := v.Type()
    15. for i := 0; i < v.NumField(); i++ {
    16. // 获取字段的值
    17. fieldValue := v.Field(i)
    18. // 获取字段的类型
    19. //fieldType := fieldValue.Type()
    20. columns := strings.Split(typ.Field(i).Tag.Get("gorm"), ";")
    21. column := ""
    22. for _, s := range columns {
    23. if strings.HasPrefix(s, "column:") {
    24. column = s[7:]
    25. }
    26. }
    27. switch fieldValue.Kind() {
    28. case reflect.Int:
    29. //fmt.Println(column, fieldValue.Interface().(int))
    30. val := fieldValue.Interface().(int)
    31. _, ok := empty[column]
    32. if val != 0 || ok {
    33. out[column] = val
    34. }
    35. case reflect.String:
    36. val := fieldValue.Interface().(string)
    37. _, ok := empty[column]
    38. if val != "" || ok {
    39. out[column] = val
    40. }
    41. case reflect.Struct:
    42. if fieldValue.Type() == reflect.TypeOf(time.Time{}) {
    43. // 处理 time.Time 类型
    44. val := fieldValue.Interface().(time.Time)
    45. _, ok := empty[column]
    46. if !val.IsZero() || ok {
    47. out[column] = val
    48. }
    49. }
    50. }
    51. }
    52. return out
    53. }

  • 相关阅读:
    C4D 2024插件Arnold mac(C4D S2024阿诺德渲染器) 中文版介绍
    封装 Encapsulation
    fegin 单客户端配置类方式设置配置
    cmd使用ssh连接Linux脚本
    最新AI创作系统源码ChatGPT源码+附详细搭建部署教程+AI绘画系统+支持国内AI提问模型
    使用nodel实现前后端数据渲染
    Linux_文件系统(内存角度)
    paddlespeech asr脚本demo
    全新分子图对比学习框架:飞桨社区开发者为你解读顶会论文
    解决Java应用程序中的SQLException:服务器时区值未识别问题;MySQL连接问题:服务器时区值 ‘Öйú±ê׼ʱ¼ä‘ 未被识别的解决方法
  • 原文地址:https://blog.csdn.net/wzw_zdhxn/article/details/139446251
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号