3
0

More than 3 years have passed since last update.

不変(readOnly)が存在しないGo言語で、どうやって構造体の持つ値を不変にするか?

Posted at

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 構造体の値を参照することができなくなるため、擬似的に不変な構造体を作成できます。

しかし、あくまでパッケージ外からの取得をできなくさせるだけなので、同一パッケージからは参照することができてしまうため、あくまで擬似的な不変性しかもたせる ことができませんでした。

上記以外にも上手いやり方があると思います。
もし他に良いやり方を知っている方がいればぜひコメントして教えていただきたいです。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0