千家信息网

怎样用GO函数式选项模式

发表于:2025-01-21 作者:千家信息网编辑
千家信息网最后更新 2025年01月21日,怎样用GO函数式选项模式,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Golang 开发者遇到的许多问题之一是尝试将一个
千家信息网最后更新 2025年01月21日怎样用GO函数式选项模式

怎样用GO函数式选项模式,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

Golang 开发者遇到的许多问题之一是尝试将一个函数的参数设置为可选. 这是一个非常常见的用例, 有些对象应该使用一些基本的默认设置来开箱即用, 并且你偶尔可能需要提供一些更详细的配置.

在很多语言中这很容易; 在 C 族语言中, 可以使用不同数量的参数提供相同函数的多个版本; 在像 PHP 这样的语言中, 可以给参数一个默认值,并在调用方法时忽略它们. 但是在 Golang 中, 这两种方式你哪个也用不了. 那么你如何创建一个函数, 用户可以指定一些额外的配置?

有很多可能的方法可以做到这一点, 但是大多数都不能满足要求, 或者需要在服务端的代码中进行额外的检查和验证, 或者通过传递额外的客户端不关心的参数来为客户端做额外的工作.

下面介绍GO 函数式选项模式(Functional Options Pattern),内容如下:

Option模式的优缺点
优点:
1. 支持传递多个参数,并且在参数个数、类型发生变化时保持兼容性
2. 任意顺序传递参数
3. 支持默认值
4. 方便拓展
缺点:
1. 增加许多function,成本增大
2. 参数不太复杂时,尽量少用

DEMO

package mainimport "fmt"type Client struct {        Id        int64        AppKey    string        AppSecret string}type Option func(*Client) //  go函数的参数都是值传递 因此想要修改Client(默认值) 必须传递指针func WithAppKey(appKey string) Option {        return func(client *Client) {                client.AppKey = appKey        }}func WithAppSecret(appSecret string) Option {        return func(client *Client) {                client.AppSecret = appSecret        }}////  NewClient//  @Description 将一个函数的参数设置为可选的功能//  @param id 固定参数,也可以将所有都放进可选参数 opts 中//  @param opts//  @return Client 返回 *Client 和 Client 都可以//func NewClient(id int64, opts ...Option) Client {        o := Client{                Id:        id,                AppKey:    "key_123456",                AppSecret: "secret_123456",        }        for _, opt := range opts {                opt(&o) //  go函数的参数都是值传递 因此想要修改Client(默认值) 必须传递指针        }        return o}func main() {        //  使用默认值        fmt.Println(NewClient(1)) //  {1 key_123456 secret_123456}        //  使用传入的值        fmt.Println(NewClient(2, WithAppKey("change_key_222"))) //  {2 change_key_222 secret_123456}        //  不按照顺序传入        fmt.Println(NewClient(3, WithAppSecret("change_secret_333"))) //  {3 key_123456 change_secret_333}        fmt.Println(NewClient(4, WithAppSecret("change_secret_444"), WithAppKey("change_key_444"))) //  {4 change_key_444 change_secret_444}}

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。

0