我想知道是否有一种方法可以像在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,默认PageQuery为0。第二个构造函数采用两个参数:TagsQuery和PageQuery。
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)