Go /可选参数中有多个构造函数?

qbu*_*fer 4 constructor go

我想知道是否有一种方法可以像在Java中那样在Go中实现多个构造函数(具有相同的函数名)。另一个选择可能是只有一个带有可选参数的构造函数,但是我不确定如何准确地做到这一点。

这似乎类似于我正在尝试做的

type Query struct {
    TagsQuery string
    PageQuery string
}

// First Constructor
func NewQuery(TagsQuery string) Query {
    return Query{
        TagsQuery: TagsQuery,
        PageQuery: "0", // default to first page
    }
}

// Second Constructor
func NewQuery(TagsQuery string, PageQuery string) Query {
    return Query{
        TagsQuery: TagsQuery,
        PageQuery: PageQuery,
    }
}
Run Code Online (Sandbox Code Playgroud)

第一个构造函数采用一个参数TagsQuery,默认PageQuery0。第二个构造函数采用两个参数:TagsQueryPageQuery

Iai*_*can 6

Dave Cheney提供了使用功能选项解决此问题的解决方案:

https://dave.cheney.net/2014/10/17/functional-options-for-friendly-apis

因此,您将接受许多可以修改正在创建的结构的函数。在您的情况下,您可以仅对可选PageQuery字段执行此操作,尽管它是一个...参数,将来可能会接受更多参数:

type Query struct {
    TagsQuery string
    PageQuery string
}

// First Constructor
func NewQuery(TagsQuery string, options ...Option) Query {
    query := Query{
        TagsQuery: TagsQuery,
        PageQuery: "0", // default to first page
    }
    // Apply options if there are any, can overwrite default
    for _, option := range options {
        query = option(query)
    }
    return query
}

// Option definition
type Option func(Query) Query

// Function to create Option func to set pageQuery
func WithPageQuery(pageQuery string) Option {
    return func(query Query) Query {
        query.PageQuery = pageQuery
        return query
    }
}
Run Code Online (Sandbox Code Playgroud)

然后调用它:

NewQuery("tags query only")
NewQuery("tags query", WithPageQuery("page query"))
Run Code Online (Sandbox Code Playgroud)