设计模式很重要, 设计模式其实就是为了解决某一类问题而形成的代码写法,设计模式很多,但是并不是每个都很常用,我们只讲解一些常用的

    设计模式分类大家可以参考:https://juejin.cn/post/6908528350986240014

    go中最常用的设计模式是函数选项模式, grpc,kratos等等开源项目中比比皆是
    有时候一个函数会有很多参数,为了方便函数的使用,我们会给希望给一些参数设定默认值,调用时只需要传与默认值不同的参数即可,类似于 python 里面的默认参数和字典参数,在java中可以提供多种构造函数,虽然 golang 里面既没有默认参数也没有字典参数,但是我们有选项模式
    注:函数选项模式是用来构造对象

    1. 对象构造

    go中没有构造器,要构造一个对象一般是直接实例化,或者采用NewXX的模式,其中

    1. 1. 实例化然后复制属性的模式会写很多行代码,虽然可以直接采用A{name:xxx, b:xxx}的模式,但是如果有个c属性的默认值不是空字符串咋办?
    2. 1. 所以整个过程使用实例化加属性设置的方式会让实例化很麻烦
    3. 1. 使用new的方式也会有问题: 如果可以一个参数设置,如果可以两个参数设置不得不使用 newAnewAandB等等各种组合设置
    4. 1. 有没有办法可以同时解决上面的问题呢? - 函数选项模式

    选项模式的应用
    从这里可以看到,为了实现选项的功能,我们增加了很多的代码,实现成本相对还是较高的,所以实践中需要根据自己的业务场景去权衡是否需要使用。个人总结满足下面条件可以考虑使用选项模式

    • 参数确实比较复杂,影响调用方使用
    • 参数确实有比较清晰明确的默认值
    • 为参数的后续拓展考虑

    在 golang 的很多开源项目里面也用到了选项模式,比如 grpc 中的 rpc 方法就是采用选项模式设计的,除了必填的 rpc 参数外,还可以一些选项参数,grpc_retry 就是通过这个机制实现的,可以实现自动重试功能。

    构造函数除了使用选项模式以外,通过config的方式构造也是另一种选择,比如viper,这两种使用都频繁,kratos和go-zero就分别是这两种应用的典范