長文になっちゃったけどちょうどいいので、ほぼこのままChatGPTに聞いてみたら"Golangには、不変性を強制する組み込みのメカニズムがないため、不変性を保証することは困難です。"って言われちゃった。
やっぱこの記事に用に、structにして値については非公開fieldにして、packageも作って隠蔽する事で、New関数の使用を強制するしかないのかな。実は普段からやってるだけのこと 契約による設計: 不変条件編type Account struct { balance int } func NewAccount(initialBalance int) (*Account, error) { if initialBalance < 0 { return nil, errors.New("初期残高は0以上である必要があります") } return &Account{balance: initialBalance}, nil }
って思ったけど、それをしてもゼロ値で不正なAccountが作られる事は同じか?どうだろ?
後さっき"structだけど値オブジェクトの様な"って書いたけど、structじゃなかったな。stringを元にしたカスタム型だった。