golangではライブラリ自体はinterfaceを提供しておらず、使う側で必要になったら作れという風潮があると思ってます。golangのinterfaceはダックタイプなので、概ねはそれで上手く行きます。
ただ、引数にenum値がある場合、素直にメソッドのシグネチャをコピペするとinterface自体が実装に依存してしまうので一工夫が必要です。
やってることはinterfaceにも同じenumを作りましょうというだけなのでなんということはないのですが、DIとかに慣れてない人はちょっと嵌りそうな気がします。
実装例は以下です。参考になれば幸いです。
package main import "fmt" // 例えば、以下のようなinterface化したいライブラリ(?)があったとする。 type Hoge struct { a int } type Mode int const ( ModeOne = iota ModeTwo ) func NewHoge(a int) *Hoge { return &Hoge{a: a} } func (h Hoge) Mul(m Mode) int { return h.a * int(m) } // ここから下はインターフェース type MulerMode int const ( MulerModeOne = iota MulerModeTwo ) // 普通にやるとMulの引数の型にModeを指定してしまうが、そうするとInterfaceが実装に依存してしまう // ここでは同じ値域のenum、MulerModeをinterfaceとセットで用意して回避する type Muler interface { Mul(m MulerMode) int } // ここから下はインターフェースを通じてHogeを使いたい場合 type MulerImpl struct { Hoge } func NewMulerImpl(a int) *MulerImpl { return &MulerImpl{Hoge: Hoge{a: a}} } func (m *MulerImpl) Mul(mm MulerMode) int { var md Mode // ここでenum同士のマッピングをする switch mm { case MulerModeOne: md = ModeOne case MulerModeTwo: md = ModeTwo default: return 0 // 本当はエラーとかだと思う } return m.Hoge.Mul(md) } // 実際に呼び出す func main() { var m Muler m = NewMulerImpl(1) fmt.Print(m.Mul(MulerModeOne)) }