Несколько конструкторов в Go / необязательные параметры? - PullRequest
2 голосов
/ 17 мая 2019

Мне было интересно, есть ли способ реализовать несколько конструкторов (с одним и тем же именем функции) в 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.

1 Ответ

5 голосов
/ 17 мая 2019

Дейв Чейни предложил решение этой проблемы с помощью функциональных опций:

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"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...