当前位置:   article > 正文

go 函数式模型

go 函数式模型

函数式模型(Functional Options Pattern)是go中常用的一种模型

比如使用的ElasticSearch ,我们可以使用这样的方式调用search api

  1. body := `
  2. {
  3. "query": {
  4. "term": {
  5. "_id": "sss"
  6. }
  7. },
  8. "pit": {
  9. "id": "iddd",
  10. "keep_alive": "3m"
  11. }
  12. }
  13. `
  14. es, _ := elasticsearch.NewDefaultClient()
  15. json.NewDecoder(&query_buffer).Decode(&body)
  16. res, err := es.Search(
  17. es.Search.WithAllowPartialSearchResults(true),
  18. es.Search.WithBody(&query_buffer),
  19. )

查看源码可以发现这个Search函数就是使用的函数式模型:

  1. type Search func(o ...func(*SearchRequest)) (*Response, error)
  2. // SearchRequest configures the Search API request.
  3. //
  4. type SearchRequest struct {
  5. Index []string
  6. DocumentType []string
  7. Body io.Reader
  8. AllowNoIndices *bool
  9. AllowPartialSearchResults *bool
  10. Analyzer string
  11. AnalyzeWildcard *bool
  12. BatchedReduceSize *int
  13. CcsMinimizeRoundtrips *bool
  14. DefaultOperator string
  15. Df string
  16. ......
  17. ctx context.Context
  18. }
  19. .....
  20. func (f Search) WithContext(v context.Context) func(*SearchRequest) {
  21. return func(r *SearchRequest) {
  22. r.ctx = v
  23. }
  24. }
  25. // WithIndex - a list of index names to search; use _all to perform the operation on all indices.
  26. //
  27. func (f Search) WithIndex(v ...string) func(*SearchRequest) {
  28. return func(r *SearchRequest) {
  29. r.Index = v
  30. }
  31. }
  32. // WithDocumentType - a list of document types to search; leave empty to perform the operation on all types.
  33. //
  34. func (f Search) WithDocumentType(v ...string) func(*SearchRequest) {
  35. return func(r *SearchRequest) {
  36. r.DocumentType = v
  37. }
  38. }

函数式模型原理

函数式模型一般是:

定义设置options对象sturct结构,这里是DBOptions

type DBOptions struct {

    host     string

    port     int

    user     string

    password string

    dbname   string

    charset  string

}

定义一个函数类型type,接受参数是DBOptions指针

type Option func(options *DBOptions)

定义设置DBOptions 每一项的具体配置的赋值函数WithXXX,名字没有固定自己定义即可,返回的是一个 Option 函数。

每个WithXXX函数中return之后的匿名函数实现具体配置的赋值逻辑。

func WithHost(host string) Option {

    return func(options *DBOptions) {

        options.host = host

    }

}

func WithPort(port int) Option {

    return func(options *DBOptions) {

        options.port = port

    }

}

func WithUser(user string) Option {

    return func(options *DBOptions) {

        options.user = user

    }

}

func WithPassword(password string) Option {

    return func(options *DBOptions) {

        options.password = password

    }

}

func WithDBName(dbname string) Option {

    return func(options *DBOptions) {

        options.dbname = dbname

    }

}

func WithCharset(charset string) Option {

    return func(options *DBOptions) {

        options.charset = charset

    }

}

定义 一个函数NewOpts,参数是一串Option函数,在该函数中依次调用每个Option函数去处理每个配置项的赋值逻辑。最后返回配置好的DBOptions。

在调用Option函数之前,可以有默认的配置项。若是不传入任何Option函数,则使用默认配置值

func NewOpts(opts ...Option) DBOptions {

    dbopts := &DBOptions{

        host:     "127.0.0.1",

        port:     3306,

        user:     "root",

        password: "123456",

        dbname:   "test",

        charset:  "utf8",

    }

    for _, opt := range opts {

        opt(dbopts)

    }

    return *dbopts

}

调用方式:

opts := NewOpts(

      WithHost("188.167.23.12"),

     //func(options *DBOptions) { options.port = port } Option函数  

    WithDBName("pro"),

     WithCharset("utf8"),

    )

    fmt.Println(opts)

需要设置什么配置项,就可以调用相关的With函数去设置,不设置就使用默认值。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/1014417
推荐阅读
相关标签
  

闽ICP备14008679号