Javaでできるのと同じように、Goに複数のコンストラクター(同じ関数名を持つ)を実装する方法があるかどうか疑問に思いました。別のオプションとして、オプションのパラメーターを持つ1つのコンストラクターのみを使用することもできますが、正確にそれを行う方法はわかりません。
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,
}
}
最初のコンストラクタは引数を1つ取りTagsQuery
、デフォルトPageQuery
は0
です。2番目のコンストラクタは2つの引数を取ります: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"))
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加