Go/可选参数中的多个构造函数?
Posted
技术标签:
【中文标题】Go/可选参数中的多个构造函数?【英文标题】:Multiple constructors in Go / optional parameters? 【发布时间】:2019-10-04 07:14:03 【问题描述】:我想知道是否有一种方法可以在 Go 中实现多个构造函数(具有相同的函数名称),就像在 Java 中一样。另一种选择可能是只有一个带有可选参数的构造函数,但我不确定该怎么做。
This seems similar to what I was trying to do
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
。
【问题讨论】:
Go 语言设计者明确选择不包含此功能,无论好坏。NewQuery
和 NewQueryWithPage
怎么样?
Optional Parameters?的可能重复
【参考方案1】:
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"))
【讨论】:
除了功能选项是不可预测/非显式的 - 使用这些是一种不好的做法。以上是关于Go/可选参数中的多个构造函数?的主要内容,如果未能解决你的问题,请参考以下文章