首页 > 其他分享 >Go实战全家桶之一:goconfig依赖注入扩展之自动注入配置项、工业级巨匠

Go实战全家桶之一:goconfig依赖注入扩展之自动注入配置项、工业级巨匠

时间:2024-08-31 18:51:38浏览次数:14  
标签:goconfig rv some var func Go com 注入

开源地址:

goconfig: git clone https://gitee.com/ichub/go.git

基础结构

package ichubconfig

import (
    "gitee.com/ichub/goconfig/common/base/basedto"
    "gitee.com/ichub/goconfig/common/base/baseutils/reflectutils"
    "github.com/gogf/gf/v2/text/gstr"
    "github.com/gogf/gf/v2/util/gconv"
    "github.com/sirupsen/logrus"
    "reflect"
    "strings"
)

type BaseConfig struct {
    basedto.BaseEntitySingle
}

func NewBaseConfig() *BaseConfig {
    var bc = &BaseConfig{}
    bc.InitProxy(bc)
    return bc
}

/*
some is ptr
*/
func (bc *BaseConfig) SetFieldConfigItem(some any, key string, value any) {

    var values = strings.Split(value.(string), ":")
    var rv = FindBeanIchubConfig().ReadVar(gstr.Trim(values[0]))
    var ifnil bool = rv == ""
    if ifnil && len(values) < 2 {
       return
    }
    if ifnil {
       rv = reflect.ValueOf(gstr.Trim(values[1]))
    }

    var rt = reflect.ValueOf(some).Elem()
    var fieldvalue = rt.FieldByName(key)
    switch fieldvalue.Kind() {
    case reflect.Int:
       fieldvalue.SetInt(gconv.Int64(rv))
    case reflect.String:
       fieldvalue.SetString(gconv.String(rv))
    case reflect.Bool:
       fieldvalue.SetBool(gconv.Bool(rv))
    case reflect.Float64:
       fieldvalue.SetFloat(gconv.Float64(rv))
    case reflect.Float32:
       fieldvalue.SetFloat(gconv.Float64(rv))
    case reflect.Uint:
       fieldvalue.SetUint(gconv.Uint64(rv))
    }

}

func (bc *BaseConfig) InjectConfigItem(some any) {

    var linkmap = reflectutils.ParseGoTag(some)

    for _, key := range linkmap.Keys() {
       value, found := linkmap.Get(key)
       if found {
          bc.SetFieldConfigItem(some, key.(string), value)
       }
    }
    if bc.Proxy() == nil {
       panic("some is nil!")
    }
    logrus.Info(some)
}应用

应用结构

package goapolloconfig

import (
    "gitee.com/ichub/goconfig/common/ichubconfig"
)

type RedisBaseConfig struct {
    ichubconfig.BaseConfig
    Id            int    `gocfg:"redis.db:0"`
    WebServerName string `gocfg:"web.server.name"`
    MaxLifetime   int    `gocfg:"gorm.maxLifetime:1200"`
}

func NewRedisBaseConfig() *RedisBaseConfig {
    var rbc = &RedisBaseConfig{}
    rbc.InitProxy(rbc)
    return rbc
}

定义接口

package baseiface

type IbaseConfig interface {
    InjectConfigItem(some any)
}

godi di all生成注入代码

package goapolloconfig

import (
    "gitee.com/ichub/goconfig/common/base/baseiface"
    "gitee.com/ichub/goconfig/common/basedi"
    "github.com/sirupsen/logrus"
    "gitee.com/ichub/goconfig/common/base/baseutils/goutils"

)

/*
* ********************************************************
* godi工具生成代码,不建议直接修改!
* ********************************************************
*/

/* ********************************************************
    @Title  文件名称: redis_base_config_init.go
    @Desp   描述:    自动注册注入

    @Author 作者: [email protected] 时间(2024-08-31 18:38:25)
    @Update 作者: [email protected] 时间(2024-08-31 18:38:25)

* *********************************************************/

const singleNameRedisBaseConfig = "*goapolloconfig.RedisBaseConfig-e60c0d18ff434618ac3cf28656cfb7dc"

// init register load
func init() {
    registerBeanRedisBaseConfig()
}

// register RedisBaseConfig
func registerBeanRedisBaseConfig() {
    basedi.RegisterLoadBean(singleNameRedisBaseConfig, LoadRedisBaseConfig)
}

func FindBeanRedisBaseConfig() *RedisBaseConfig {
    bean, ok :=  basedi.FindBean(singleNameRedisBaseConfig).(*RedisBaseConfig)
    if !ok {
        logrus.Errorf("FindBeanRedisBaseConfig: failed to cast bean to *RedisBaseConfig")
        return nil
    }
    return bean

}

func LoadRedisBaseConfig() baseiface.ISingleton {
    var s = NewRedisBaseConfig()
    InjectRedisBaseConfig(s)
    return s

}

func InjectRedisBaseConfig(s *RedisBaseConfig)    {

    goutils.Debug("inject")
}

测试用例与测试结果

func Test012_FindBeanRedisBaseConfig(t *testing.T) {

    FindBeanRedisBaseConfig()

}

INFO[2024-08-831 18:51:57]D:/go-ichub/go/goconfig/common/ichubconfig/base_config.go:70 gitee.com/ichub/goconfig/common/ichubconfig.(*BaseConfig).InjectConfigItem() {
     "Id": 0,
     "WebServerName": "web.server.com",
     "MaxLifetime": 7200

注入代码实现:

func (this *beanContainer) FindBean(name string) (*BeanInfo, bool) {
    this.lock.RLock()
    defer this.lock.RUnlock()

    var beanInfo, ok = this.container[name]
    if !ok {
       logrus.Error(name, " bean found?", ok)
       return nil, ok
    }
    if beanInfo.bean == nil {
       beanInfo.SetBean(beanInfo.CreateBean())
    }
    this.autoInjectConfigItem(beanInfo)
    return beanInfo, ok
}

func (this *beanContainer) autoInjectConfigItem(beanInfo *BeanInfo) {
    if ibcfg, ok := beanInfo.bean.(baseiface.IbaseConfig); ok {
       ibcfg.InjectConfigItem(ibcfg)
    }
}

配置文件:

标签:goconfig,rv,some,var,func,Go,com,注入
From: https://blog.csdn.net/leijmdas/article/details/141756645

相关文章

  • Goolge earth studio 进阶4——路径修改与平滑
    如果我们希望在大约中途时获得更多的城市鸟瞰视角。可以将相机拖动到这里并创建一个新的关键帧。camera_target_clip_7EarthStudio会自动平滑我们的路径,所以当我们通过这个关键帧时,不是一个生硬的角度,而是一个平滑的曲线。camera_target_clip_8路径上有贝塞尔控制......
  • Go plan9 汇编: 打通应用到底层的任督二脉
    原创文章,欢迎转载,转载请注明出处,谢谢。0.前言作为一个严肃的Gopher,了解汇编是必须的。本汇编系列文章会围绕基本的Go程序介绍汇编的基础知识。1.Go程序到汇编首先看一个简单到令人发指的示例:packagemainfuncmain(){ a:=1 print(a)}运行程序,输出:#gorun......
  • SQL注入
    SQL注入(SQLInjection)是一种网络攻击技术,攻击者通过在输入字段中注入恶意的SQL代码,使得应用程序执行非预期的SQL查询,进而绕过身份验证、读取、修改甚至删除数据库中的数据。SQL注入是由不安全的SQL查询引起的,通常是因为应用程序直接将用户输入拼接到SQL查询中,而没有对输入进行充分......
  • 了解依赖反转原则(DIP)、控制反转(IoC)、依赖注入(DI)及 IoC容器
    这篇文章将描述DIP、IoC、DI和IoC容器。大多数情况下,初学者开发人员会遇到DIP、IoC、DI和IoC容器的问题。他们混淆在一起,发现很难辨别他们之间的区别,不知道为什么他们需要使用他们。另一方面,很多人使用DI,IoC却不知道它能解决什么问题。关于这个话题有很多帖子......
  • django 内置server 外网不能访问, 报连接超时
    django内置server外网不能访问,报连接超时pythonmanage.pyrunserver不能外网访问 ===============================1确保开启了服务pythonmanage.py runserver0.0.0.0:80 ===============================2 确保开启了防火墙(1)查看防火墙端口#查看开放的......
  • opencv 判断某个坐标点是否在多边形内cv::pointPolygonTest
        cv::pointPolygonTestpointPolygonTest 函数在OpenCV中用于判断点是否在一个多边形的内部、外部或在边界上。该函数不需要考虑多边形的凹凸性,即它可以处理凸多边形和凹多边形。  判断坐标点是否在坐标围起来的区域内判断点是否在点组成的封闭区域......
  • go apollo config
    在Go语言中,如果你想使用Apollo配置中心,你可以使用Agollo客户端。Agollo是一个专为Golang应用程序设计的Apollo配置中心客户端,它提供了一系列功能,包括多IP、AppID和namespace支持,实时同步配置,灰度配置,延迟加载与容灾机制,自定义组件以及安全性增强等。要开始使用Agollo,你需要按......
  • django.core.exceptions.ImproperlyConfigured: 'django.contrib.gis.db.backends.mys
     没解决此问题(venv)[root@VM-8-12-centosMYPROJECT-django20240830]#python3manage.py runserver0.0.0.0:8080Exceptioninthreaddjango-main-thread:Traceback(mostrecentcalllast): File"/root/MYPROJECT/backend/venv/lib/python3.8/site-packages/django/d......
  • Go 语言生产服务故障案例精析
            大多数Go开发者都停留在简单的增删改查层面,对Go语言本身掌握程度不够,对常用依赖或者开源组件掌握不够,在开发项目过程中总会不经意间引入一些千奇百怪的问题,并且在遇到线上问题时往往束手无策。下面列举一些线上问题以及相应的解决思路,希望大家能从这些问题......
  • Study Plan For Algorithms - Part16
    1.下一个排列题目链接:https://leetcode.cn/problems/next-permutation/整数数组的一个排列就是将其所有成员以序列或线性顺序排列。整数数组的下一个排列是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组......