google-code-prettify

2012-10-05

Goでchannelに入れることができる型を限定する

以下のようなstructがあったとする。

type Cmd1 struct {
    id int
}
type Cmd2 struct {
    msg string
}
あるchannelにCmd1とCmd2の両方を入れたいとする。その場合var ch chan interface{}とすればCmd1もCmd2も入れることができるchannelになるが、このchannelにはintもfloat32も他のstructも何でも入ってしまう。

コンパイル時にCmd1とCmd2以外を入れていないことをチェックするには、以下のようにすれば良い。

type Cmd interface {
    isCmd() bool
}

type CmdBase struct {
}

func (c CmdBase) isCmd() bool {
    return true
}

type Cmd1 struct {
    CmdBase
    id int
}

type Cmd2 struct {
    CmdBase
    msg string
}
これで、var ch chan Cmdとchannelを作れば、Cmd1とCmd2以外を間違ってchannelに入れてしまう可能性をかなり減らせる。

0 件のコメント: