Go语言实现结构体初始化设置默认值

在Go语言中结构体原生语法是不支持设置默认值的,这就在很多场景中需要增加额外的步骤,去设置一些默认值。

自从 Go 1.18支持泛型后,再通过反射功能即可实现为结构体设置默认值。

原理也非常简单,只要将结构体的标签中设置一个Key,即可通过Key的值赋予对象的指定字段。

package main

import (
    "fmt"
    "reflect"
    "strconv"
)

type Person struct {
    Name string `df:"无名氏"`
    Age  int    `df:"18"`
}

func main() {
  // 实例化类并指定标签
    p := NewClass(Person{}, "df")
  // 结果:{无名氏 18}
    fmt.Println(p)
}

// 实例化结构体
// 目前只能实现基本数据类型
func NewClass[T any](cls T, dfKey string) T {

    rt := reflect.ValueOf(&cls).Elem()
    vt := rt.Type()

    for i := 0; i < rt.NumField(); i++ {

        f := rt.Field(i)
        tag, ok := vt.Field(i).Tag.Lookup(dfKey)
        if ok {
            switch f.Kind() {

            case reflect.Bool:
                i, _ := strconv.ParseBool(tag)
                f.SetBool(i)

            case reflect.String:
                f.SetString(tag)

            case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
                i, _ := strconv.ParseInt(tag, 10, 64)
                f.SetInt(i)

            case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
                i, _ := strconv.ParseUint(tag, 10, 64)
                f.SetUint(i)

            case reflect.Float32, reflect.Float64:
                i, _ := strconv.ParseFloat(tag, 64)
                f.SetFloat(i)

      // 更多数据类型支持需要自己定义规则
            }
        }
    }

    return cls
}


文章来源地址https://www.toymoban.com/diary/problem/269.html


到此这篇关于Go语言实现结构体初始化设置默认值的文章就介绍到这了,更多相关内容可以在右上角搜索或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

原文地址:https://www.toymoban.com/diary/problem/269.html

如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用
上一篇 2023年08月19日 16:46
下一篇 2023年08月19日 16:46

相关文章

  • VScode:初始化恢复默认设置

    第一步:在VScode左下角点击设置 第二步:点击这个按钮 第三步:将大括号里的内容全部删除,这些都是你当前的用户设置 第四步:清空后,VScode的设置就初始化了,你会发现我的背景变了,因为我将主题的设置也删除了,所以就恢复默认主题了【记得ctrl + S(保存)】

    2024年03月21日
    浏览(50)
  • Git设置初始化默认分支为main

    github创建项目的默认分支为main。本地创建的git分支默认为master,每次在本地新建一个仓库再关联到remote,分支不统一。 git在2.28版本中提供了一个配置,指定在执行 git init 的时候生成的默认分支 本地git版本不够的话先升级; 如果使用homebrew安装的git,直接升级即可 或者可以

    2024年02月13日
    浏览(54)
  • go语言数据初始化

    数据的声明: 初始化数组的初始化有多种形式。 [5] int {1,2,3,4,5} 长度为5的数组,其元素值依次为:1,2,3,4,5。 [5] int {1,2} 长度为 5 的数组,其元素值依次为:1,2,0,0,0 。 在初始化时没有指定初值的元素将会赋值为其元素类型 int 的默认值0,string 的默认值是 “”。

    2024年02月03日
    浏览(50)
  • go语言包、变量、init初始化顺序

    一个完整的 go 语言可运行程序,通常会包含引用的包、变量、init 函数以及 main 函数几个部分。 包、变量、常量、init 函数以及 main 函数初始化顺序如下图所示: 在一个 go 语言程序中,初始化顺序规则如下: 引入的包 当前包中的变量、常量 当前包的 init 函数 main 函数 初始

    2023年04月14日
    浏览(52)
  • 【Golang入门教程】Go语言变量的初始化

    强烈推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站: 人工智能 推荐一个个人工作,日常中比较常用的人工智能工具,无需魔法,忍不住分享一下给大家。点击跳转到网站: 人工智能工具 引言 在Go语言中,变量

    2024年04月17日
    浏览(79)
  • 【Go 基础篇】Go语言 init函数详解:包的初始化与应用

    在Go语言中, init() 函数是一种特殊的函数,用于在包被导入时执行一次性的初始化操作。 init() 函数不需要手动调用,而是在包被导入时自动执行。这使得我们可以在包导入时完成一些必要的初始化工作,确保包的使用具有正确的环境和状态。 本篇博客将深入探讨 init() 函数

    2024年02月11日
    浏览(50)
  • 数据结构_链表_双向循环链表的初始化、插入、删除、修改、查询打印(基于C语言实现)

    版本: 2024年4月26日 V1.0 发布于博客园 目录 目录 双向循环链表公式 初始化双向循环链表 构建双向循环链表结点 创建一个空链表(仅头结点) 创建一个新结点 插入数据 头插 中插 尾插 删除数据 头删 中删 尾删 查询打印数据 遍历打印 测试 测试结果: 完整代码 DoubleCirLList.h

    2024年04月27日
    浏览(55)
  • 数据结构_链表_单向循环链表的初始化、插入、删除、修改、查询打印(基于C语言实现)

    版本: 2024年4月25日 V1.0 发布于博客园 目录 目录 单向循环链表公式 初始化单向循环链表 构建单向循环链表结点 创建一个空链表(仅头结点) 创建一个新结点 插入数据 头插 中插 尾插 删除数据 头删 中删 尾删 查询打印数据 遍历打印 测试 测试结果: 完整代码 CircularLinkedLis

    2024年04月25日
    浏览(51)
  • C语言结构体的初始化方式

    逐个初始化字段 :这是最直接的方式,你可以逐个为结构体的每个字段进行初始化。 2.使用结构体字面值初始化 :这种方式允许你在初始化时使用一个字面值来为结构体提供初始值 3. 全局初始化 :在全局范围内,你可以在变量声明时就进行初始化。 4. 使用  memset  函数 :

    2024年02月09日
    浏览(57)
  • C语言:结构体数组的使用和初始化:

    前文:在C语言中,结构体是经常会用到的自定义数据类型,通常在使用结构体时,我们会进行单一的结构体初始化。但在使用同一个结构体,初始化不同的数据时,则可以用到结构体数组来进行初始化。 结构体数组是指在一个数组中存储多个结构体对象的集合。结构体是一

    2024年02月04日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包