删除文章

确定要删除这篇文章吗?

取消
确定

golang Options可变参数接口设计

     阅读(34)  2019-11-05 13:23:04

golang中发现不少第三方库使用...Options作为接口参数,说不上这种方式有多好但是了解下也是不错的。

如下代码新建一个exchange,一个必填参数其他的是可选参数。

package main

import "fmt"

type Options struct {
    Name string
    Kind string
    Durable bool
    AutoDelete bool
    Internal bool
    NoWait bool
}

type Option func(*Options)

type Exchange struct {
    opts Options
}

func NewExchange(name string, opts ...Option) *Exchange {
    exchange := new(Exchange)
    exchange.opts = Options{
        Name: name,
    }
    for _, o := range opts {
        o(&exchange.opts)
    }
    return exchange
}

func (exchange *Exchange) Publish(content string) error {
    fmt.Println(exchange.opts, content)
    return nil
}

func Kind(val string) Option {
    return func(o *Options) { o.Kind = val }
}

func Durable(val bool) Option {
    return func(o *Options) { o.Durable = val }
}

func main() {
    conn := NewExchange("***:8080", Kind("hello"), Durable(true))
    conn.Publish("ping")
}

这种接口的优点是参数比较灵活,参数的意义清晰明白。
缺点是每个可选参数都要提供一个函数,第一眼看上去不明白...Options可变参数怎么填,还要看源码提供的方法。

这种方式比较适合参数多的接口

文章评论

Keep it simple,stupid
文章数
303
总访问量
491380
今日访问
1756
最近评论

tujiaw : registerThreadInactive:如果当前没有激活的线程,就去激活线程,让等待的线程去执行任务。
hgzzx : 佩服佩服。 请教:registerThreadInactive的作用是什么?
xuehaoyun : 很不错,来围观一下
tujiaw : 抱歉csdn code服务关闭了,这个代码我也找不到了
于淞 : 你好,这个文章的源码能分享一下吗,songsong9181@163.com,谢谢了 上面的写错了
于淞 : 你好,这个文章的源码能分享一下吗,838106303@163.com,谢谢了 上面的链接不能用了
tujiaw : 多谢多谢
essaypinglun college-paper.org : 很好的博客,赞赞
Folly : 这个实现有点奇怪,Qt为什么没有统一的比对方法。
过多s : alert("hello, world!")
回到顶部