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,默认PageQuery0。第二个构造函数有两个参数:TagsQueryPageQuery

【问题讨论】:

Go 语言设计者明确选择不包含此功能,无论好坏。 NewQueryNewQueryWithPage 怎么样? 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/可选参数中的多个构造函数?的主要内容,如果未能解决你的问题,请参考以下文章

Java 构造函数 - 子类构造函数中的可选参数

Angular如何传递跳过一些[重复]的可选构造函数参数

第二条:遇到多个构造器参数时要考虑用构建器

C#基础 可选参数调用params无参静态构造函数

TypeScript 中的多个可选参数 [重复]

OpenCV类VideoCapture构造函数中参数apiPreference的可选值及意义