Goライブラリで次のインターフェイスを定義するとします。
type Task interface {
Do() error
}
func Register(task Task) { ... }
func GetId(task Task) int64 { ... }
でRegister()、ライブラリは一意int64を各タスクインスタンスに関連付けます。GetId()指定されたタスクの識別子を返す必要があります。
私の最初のアイデアは、関連付けをとして保存することでしたmap[Task]int64。これは問題なく機能しているように見えますが、実装しているオブジェクトTaskが同等に比較できない場合(たとえば、をstruct含むmap)、機能しなくなると言われました。私はまだこれが本当かどうかを確認する必要があります。
代わりにスライスを試して使用し、struct { task Task; id int64 }それを繰り返し処理するつもりでしたが、それでも同等の同等のTaskインスタンスが必要になります。そして、AFAIUにはGoにアイデンティティの比較はありません。
TaskインスタンスからIDへの堅牢なマッピングを作成するにはどうすればよいですか?
編集:これまでに提案された両方のソリューションは機能しますが、すべてのタスク実装にIDを処理するための反復コードを含める必要があるという欠点があります。埋め込むことができるTaskBaseでそのコードを提供することもstructできますが、理想的には、IDについてさえ知るための実装を必要としないソリューションを好みます(IDはライブラリの内部にあり、ライブラリの外部では意味がありません)。