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はライブラリの内部にあり、ライブラリの外部では意味がありません)。