Go言語でoptinal型もどきを使う


はじめに

go言語を使用していて、optionalが使えなくて困ったため。
ライブラリを入れる程ではないので、以下のコードを参考に書いてみた。
参考 https://github.com/markphelps/optional

実装したメソッドの概要

NewInt(i int) optional.Int

optional型を作成する。

Get() (int, bool)

optinalの中身を取り出す。値が存在するときは、value true, ないときは、0, falseを返す。

Set(i int)

optionalに値を設定する。

Present() bool

値があるか、どうかをチェックする。

コードの中身

package optional

// Int - optional int
type Int struct {
    value *int
}

// NewInt - create an optional.Int from int
func NewInt(i int) Int {
    return Int{value: &i}
}

// Get - get the wrapped value
func (i Int) Get() (int, bool) {
    if i.Present() {
        return *i.value, true
    }
    var zero int
    return zero, false
}

// Set - set value
func (i Int) Set(j int) {
    i.value = &j
}

// Present - return whether or not the value is present.
func (i Int) Present() bool {
    return i.value != nil
}

あとがき

簡単な実装ですが、optionalっぽいことができてよかった。
optional.Int{}でNoneの状態が書けるのがよいです。
jsonにデコードしたり、他の型でのoptionalが欲しい場合は、https://github.com/markphelps/optional をインポートすると良いと思います。