Skip to content

Goで型の生成するときコンストラクタを強制したい

基本的には Make the zero value useful. した方が「らしく」なるけど、APIのリクエスト値など必須としたいこともある。

エクスポートしていない構造体を返す

Section titled “エクスポートしていない構造体を返す”
type createPostRequest struct {
Poem string
}
func NewCreatePostFrom(form url.Values) *createPostRequest {...}

この場合、 Poem などのフィールドは触れるが、 var で宣言ができなくなる。デメリットとしては、型の情報がドキュメントに出てこなくなって不便。

ほとんど非公開の方法と同じだけど、公開したインターフェイスを返すところが異なる。

type CreatePostRequest interface {
Poem() string
}
type createPostRequest struct {
poem string
}
func (r *createPostRequest) Poem() string
func NewCreatePostFrom(form url.Values) CreatePostRequest {...}

getterを書かなければいけなくなって面倒くさいが公開された型になるのでドキュメントにも出てくる。

gofactoryのようなlinterが使える。この程度なら自作してもいいかもしれない。

ドキュメントでコンストラクタを使えと書く

Section titled “ドキュメントでコンストラクタを使えと書く”

強制はできないが、一般的には NewXxx があればそれを使うだろう。