首页 > 其他分享 >goft-gin

goft-gin

时间:2023-02-27 07:33:14浏览次数:42  
标签:调用 return get goft cfg reflect gin

在B站看到以Goft-gin(https://github.com/shenyisyn/goft-gin)为基础的DDD视频,那么今天就和这个Goft-gin来简单交流一下。整体上Goft-gin,在Gin框架为基础,增加了一些依赖注入,表达式等。细节就不说了,以下列出了我看到的一些东西

  1. IoC and DI

    IoC(Inversion of Conctrol) ,DI(Dependency Injection),简单来说IOC是将对象的创建过程由主动创建交给容器控制,而DI是IoC的一种实现方式,可参考(https://stackoverflow.com/questions/6550700/inversion-of-control-vs-dependency-injection

    Goft-gin如何来做这件事

// 定义工厂类型及其方法
func NewMyConfig() *MyConfig {
  return &MyConfig{}
}

func (this *MyConfig) Test() *Services.TestService {  // 工厂类型的方法
  return Services.NewTestService("mytest")
}

// 全局Map定义
type BeanMapper map[reflect.Type]reflect.Value

type BeanFactoryImpl struct {
  beanMapper BeanMapper
  ExprMap    map[string]interface{}
}

// 通过反射来,遍历工厂类的所有方法,结果存入全局Map
func (this *BeanFactoryImpl) Config(cfgs ...interface{}) {
  for _, cfg := range cfgs {
    t := reflect.TypeOf(cfg)
    if t.Kind() != reflect.Ptr {
      panic("required ptr object") //必须是指针对象
    }
    if t.Elem().Kind() != reflect.Struct {
      continue
    }
    this.Set(cfg)                       
    this.ExprMap[t.Elem().Name()] = cfg 
    this.Apply(cfg)                     
    v := reflect.ValueOf(cfg)
    for i := 0; i < t.NumMethod(); i++ {
      method := v.Method(i)
      callRet := method.Call(nil)   // 工厂类型的方法被调用

      if callRet != nil && len(callRet) == 1 {
        this.Set(callRet[0].Interface())  // 调用结果存入全局Map
      }
    }
  }
  }
  
// 处理依赖注入
func (this *BeanFactoryImpl) Apply(bean interface{}) {
  if bean == nil {
    return
  }
  v := reflect.ValueOf(bean)
  if v.Kind() == reflect.Ptr {
    v = v.Elem()
  }
  if v.Kind() != reflect.Struct {
    return
  }
  for i := 0; i < v.NumField(); i++ {
    field := v.Type().Field(i)
        if get_v := this.Get(field.Type); get_v != nil {
          v.Field(i).Set(reflect.ValueOf(get_v))
          this.Apply(get_v)
        }
      }
    }
  }
}

  1. 有意思的Go追踪错误的方式

    使用了Panic+Recover的方式,结合Gin中间件来使用,错误时通过panic来返回堆栈调用信息

    一般Go中,为了打印error的调用信息,会使用erros.wrap来层层封装调用信息,从而在发生错误时代替堆栈调用信息打印

    后续试试

  2. 链式调用模式:返回自身,代码清晰

goft.Ignite(cros(), errorFunc()).
    Config(Configuration.NewMyConfig()).
    Attach(fairing.NewGlobalFairing()).
    Mount("", classes.NewIndexClass()). //控制器,挂载到v1
    Config(Configuration.NewRouterConfig()).
    Launch()

标签:调用,return,get,goft,cfg,reflect,gin
From: https://www.cnblogs.com/cclever/p/17158399.html

相关文章

  • AtCoder Beginner Contest 291
    比赛链接A-camelCase题目大意给一个由英文字母构成的字符串\(S\),\(S\)中只有一个大写字母,输出该大写字母是字符串中第几个字母。题目思路遍历字符串找出大写字母......
  • nginx配置
     1.nginx作用(1)请求转发;(2)负载均衡;(3)动静分离;请求转发:负载均衡  动静分离可以把后端和前端资源分开部署   2. 配置ng......
  • systemctl开启、关闭、重启nginx的实现
    最近在配置tomcat和nginx的时候发现这些命令并不能直接用systemctl,其实很容易实现的。下面就是蜜蜂实现用systemctl来开启、关闭、重启nginx的过程,其他的也都大差不差。首先......
  • (AtCoder Beginner Contest 289)And Codeforces Round #851 (Div. 2)
     <C-Coverage Editorial>       这道题可以用dfs进行爆搜,但是在爆搜的时候要注意:是否同一个状态重复计数了比如dfs(i......
  • logging
    记录器Loggers创建日志记录处理器Handlers将日志记录发送到适当的目标过滤器Filters确定要输出的日志记录格式器Formatters最终输出中日志记录的样式记录器对象......
  • 解决nginx报错:nginx: [emerg] bind() to 0.0.0.0:8088 failed (13: Permission denied
    报错描述:nginx:[emerg]bind()to0.0.0.0:8088failed(13:Permissiondenied)通过ansible远程给主机更换端口并重新启动nginx服务,出现以上报错信息(权限被拒绝)。解......
  • wallpaper Engine 手机版使用教程
    首先去酷安下载壁纸引擎https://www.coolapk.com/apk/io.wallpaperengine.weclient 然后去下载壁纸https://wwo.lanzouy.com/b02uien6j(提取码 8llq) 把下载......
  • 谷粒商城Nginx代理网关
    首先需要在C:\Windows\System32\drivers\etc中的host文件下加入192.168.56.10gulimall.com//192.168.56.10虚拟机的ip地址 本机浏览器请求gulimall.com,通过配置hosts文件......
  • AtCoder Beginner Contest 281 A-F 题解
    比赛链接A-CountDown先这样,就这样。点击查看代码#include<cstdio>intn;intmain(){ scanf("%d",&n); for(inti=n;i>=0;i--)printf("%d\n",i); re......
  • springboot3.0整合GraalVM-Native-Support,打包本地exe(native-image)。添加native-maven
    0.【idea新建一个springbootdemo项目】勾选GraalVMNativeSupport。其它略(太基础了)1.【环境准备】安装GraalVM、VisualStudio、NativeImage​​https://gitee.com/lishu......