前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Golang动态可变函数参数 参数默认值

Golang动态可变函数参数 参数默认值

作者头像
HHTjim 部落格
发布2024-08-17 13:54:07
770
发布2024-08-17 13:54:07
举报
文章被收录于专栏:HHTjim'S 部落格

Golang动态可变函数参数 参数默认值

作者:matrix 被围观: 4 次 发布时间:2024-08-17 分类:Golang | 无评论 »

Golang是不支持函数参数默认值的,但是也有很多办法可以解决

动态可变参数

代码语言:javascript
复制
func main() {
    addItem("11", "a1")
    addItem("2", "a2", "222")
}

func addItem(name, value string, opts ...string) {
    fmt.Println("add item-->", name, value)
    for _, opt := range opts {
        fmt.Println("opt:", opt)
    }
}

其中opts ...string 表示可变参数,类型为string,如果需要不同类型传入 看下面

可变参数 + 动态类型

代码语言:javascript
复制
type AlfredItem struct {
    Title    string
    Subtitle string
    Arg      int
}

type AlfredWorkflow struct {
    Items []AlfredItem
}

func (aw *AlfredWorkflow) AddItem(name, value string, opts ...func(*AlfredItem)) {
    item := AlfredItem{
        Title:    value,
        Subtitle: name,
        Arg:      111,
    }
    for _, opt := range opts {
        opt(&item)
    }
    aw.Items = append(aw.Items, item)
}

func main() {
    aw := AlfredWorkflow{}
    aw.AddItem("A", "a")
    aw.AddItem("B", "b", func(ai *AlfredItem) {
        ai.Arg = 22222
    }, func(ai *AlfredItem) {
        ai.Arg = 3333
    })

    fmt.Printf("%+v", aw)
}

高阶用法 封装为选项模式(Option Pattern)

采用Functional Options Patter方法来解决

核心点:定义 type func(*AlfredItem),且每个参数定义with函数

代码语言:javascript
复制
type AlfredItem struct {
    Title    string
    Subtitle string
    Arg      int
}

type AlfredWorkflow struct {
    Items []AlfredItem
}

type Option func(*AlfredItem)

func WithTitle(title string) Option {
    return func(ai *AlfredItem) {
        ai.Title = title
    }
}
func WithSubtitle(subtitle string) Option {
    return func(ai *AlfredItem) {
        ai.Subtitle = subtitle
    }
}

func WithArg(arg int) Option {
    return func(ai *AlfredItem) {
        ai.Arg = arg
    }
}

func (aw *AlfredWorkflow) AddItem(name, value string, opts ...Option) {
    item := AlfredItem{
        Title:    value,
        Subtitle: name,
        Arg:      111,
    }
    for _, opt := range opts {
        opt(&item)
    }
    aw.Items = append(aw.Items, item)
}

func main() {
    aw := AlfredWorkflow{}
    aw.AddItem("DefaultName", "DefaultVlaue")
    aw.AddItem("DefaultName-B", "DefaultVlaue-b", WithArg(222), WithSubtitle("0000"))
    aw.AddItem("C", "c", WithTitle("hahah"))

    fmt.Printf("%+v", aw)
}

参考:

https://www.cnblogs.com/smartrui/p/10324320.html

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-08-17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Golang动态可变函数参数 参数默认值
    • 动态可变参数
      • 可变参数 + 动态类型
        • 高阶用法 封装为选项模式(Option Pattern)
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档