最近发现不少小伙伴都对golang很感兴趣,所以今天继续给大家介绍Golang相关的知识,本文《Go 中的多个构造函数/可选参数?》主要内容涉及到等等知识点,希望能帮到你!当然如果阅读本文时存在不同想法,可以在评论中表达,但是请勿使用过激的措辞~
问题内容
我想知道是否有一种方法可以在 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。第二个构造函数采用两个参数: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
}
}
然后调用它:
NewQuery("tags query only")
NewQuery("tags query", WithPageQuery("page query"))