Дейв Чейни предложил решение этой проблемы с помощью функциональных опций:
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"))