Go言語には不変(readOnly) を示すことができない
広く知られていることですが、Go言語は指定した変数などを不変にするための機能を持っていません。
プログラムを書く点においては割と重要で、実際にコミュニティでも議論されているようです。
https://github.com/golang/go/issues/32245
では現行のGo言語で不変な構造体を作成するにはどうすればいいのでしょうか?簡単に作成してみました。
別パッケージに定義し、外部から参照できないようにする
Go言語では構造体を定義する時に、頭文字を大文字にするか小文字にするかで外部のパッケージからその値が参照できるかどうかを決定します。
そこで、今回の主題である構造体自体を別パッケージに定義し、閉じ込めることで実現してみました。
main.go
package main
import "fmt"
import "~/money"
func main() {
Money := money.NewMoney(100, "doll")
fmt.Println(Money)
}
money/money.go
package money
type money struct {
amount int
currency string
}
func NewMoney(amount int, currency string) *money {
if currency == "" {
panic("currency を入力してください")
}
return &money{
amount: amount,
currency: currency,
}
}
こうすることで、moneyパッケージ外からmoney 構造体の値を参照することができなくなるため、擬似的に不変な構造体を作成できます。
しかし、あくまでパッケージ外からの取得をできなくさせるだけなので、同一パッケージからは参照することができてしまうため、あくまで擬似的な不変性しかもたせる ことができませんでした。
上記以外にも上手いやり方があると思います。
もし他に良いやり方を知っている方がいればぜひコメントして教えていただきたいです。