Go语言中支持多个构造函数/可选参数吗?

10

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

这似乎类似于我想要做的事情

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,
    }
}

第一个构造函数接受一个参数TagsQuery,并将PageQuery默认值设为0。第二个构造函数接受两个参数:TagsQueryPageQuery


4
Go语言设计者明确选择不包含此功能,无论好坏。那NewQueryNewQueryWithPage呢? - Luke Joshua Park
可能是[可选参数?]的重复问题(https://dev59.com/bnI-5IYBdhLWcg3wED9V)。 - Henry Woody
1个回答

13

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
    }
}

然后调用它:

NewQuery("tags query only")
NewQuery("tags query", WithPageQuery("page query"))

除非功能选项是不可预测/不明确的,否则使用它们是一个不好的做法。 - alex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接