オブジェクトのフィールドが増えると初期化する時の手間も増えてきてしまい、Java ならビルダパターンなどで必須パラメータと任意パラメータをうまく分けられたのですが、Go言語ではどうしているのか検索しました:
ベストアンサーではないけれど UpVote が一番ついているものを見てみると、functional options というアイデアがあって、可変長引数でメソッドを渡して、その中で任意パラメータを処理する方法です。詳しくは以下のブログで紹介されています。
Functional options for friendly APIs | Dave Cheney
例えば id
のみ必須パラメータであとは任意にしたい場合は以下のように書けます。最後の可変長引数はメソッドであれば何でも渡せてしまうので、そのオブジェクト(上なら Foo)のフィールドは外部パッケージからは非公開になるようにしておいた方がよさそうです。
func NewFoo(id string, options ...func(*Foo)) Foo { foo := Foo{id: id} for _, option := range options { option(&foo) } return foo }