zoukankan      html  css  js  c++  java
  • 【go】wire的具体各类用法

    本文仅记录wire的具体使用方法, 而wire这个工具的作用, 功能和优缺点不再赘述

    wire的github地址: https://github.com/google/wire

    demo中struct依赖关系

    场景一 成员变量是结构体类型

    用法一: 直接通过各struct的new函数拼装

    自定义了所有struct的new函数, 通过wire.Build()组装

    func InitService1() *Service {
        wire.Build(NewService1, NewRemoteCallA, NewRemoteCallB)
        return &Service{}
    }
    

    用法二: 使用ProviderSet(可包含大于等于1个new函数)

    将New函数放到ProviderSet里, 再传到wire.Build函数内

    var RemoteCallSet = wire.NewSet(NewRemoteCallA, NewRemoteCallB)
    
    func InitService2() *Service {
        wire.Build(NewService1, RemoteCallSet)
        return &Service{}
    }
    

    ProviderSet里可以是其他ProviderSet 千层饼一样嵌套下去

    用法三: 最上层struct不需要提供new函数, 以wire.Struct代替

    使用wire.Struct() 代替最终要生产的struct的New函数

    第二个参数 "*" 表示所有字段都进行初始化

    wire.Value() 作用是将值转化为一个ProviderSet, 以满足wire.Build()入参类型

    func InitService3() *Service {
        wire.Build(wire.Struct(new(Service), "*"), NewRemoteCallA, NewRemoteCallB, wire.Value("a"))
        return &Service{}
    }
    

    用法四: wire.Struct 指定具体字段

    wire.Struct() 不使用 "*" 而是指定具体字段名

    func InitService4() *Service {
        wire.Build(wire.Struct(new(Service), "remoteCallA"), NewRemoteCallA)
        return &Service{}
    }
    

    用法五:部分字段由入参传入

    部分字段通过入参传入, 而不是通过wire.Build中指定

    func InitService5(rb *RemoteCallB, c string) *Service {
        wire.Build(wire.Struct(new(Service), "*"), NewRemoteCallA)
        return &Service{}
    }
    

    需要注意的是结构体里不能有相同类型的两个及以上的字段, 如:

    type Service struct {
      a string
      b string
      // ... 其他字段
    }
    

    是不允许的, 解决方法就是使用类型别名解决冲突, 会报错

    provider struct has multiple fields of type string
    

    场景二: 成员变量为interface类型

    用法一: 使用返回interface的new函数

    func InitService7() *Service2 {
        wire.Build(wire.Struct(new(Service2), "*"), NewRemoteCallInterface, wire.Value("a"))
        return &Service2{}
    }
    

    用法二: 使用ProviderSet, 将具体struct的New函数绑定到interface上

    var RemoteCallASet = wire.NewSet(NewRemoteCallA, wire.Bind(new(RemoteCall), new(*RemoteCallA)))
    
    func InitService8() *Service2 {
        wire.Build(wire.Struct(new(Service2), "*"), RemoteCallASet, wire.Value("a"))
        return &Service2{}
    }	
    ```[]()
  • 相关阅读:
    详解GaussDB(for MySQL)服务:复制策略与可用性分析
    华为云的研究成果又双叒叕被MICCAI收录了!
    充分释放数据价值:安全、可信6到飞起
    未来云原生世界的“领头羊”:容器批量计算项目Volcano 1.0版本发布
    一文带你掌握OBS的两种常见的鉴权方式
    数据库实践丨MySQL多表join分析
    技术贴丨教你使用华为云鲲鹏服务器部署Discuz!论坛
    python Scrapy 从零开始学习笔记(二)
    python Scrapy 从零开始学习笔记(一)
    从零开始学Electron笔记(七)
  • 原文地址:https://www.cnblogs.com/Me1onRind/p/13624487.html
Copyright © 2011-2022 走看看