Я пытаюсь обобщить часть своего кода, и я подумал, что смогу собрать вместе какой-то общий код, но я ударился головой о проблему системы типов.
Давайте предположим, что яу меня есть такой интерфейс:
type Hashable interface {
GetHash() []byte
}
и у меня есть пара конкретных типов, таких как:
type Transaction struct {
Hash []byte `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty"`
}
func (m *Transaction) GetHash() []byte {
if m != nil {
return m.Hash
}
return nil
}
Обратите внимание, что они генерируются protoc
, и я, вероятно, не могуизменить их легко.Хотя сам тип не реализует Hashable
, указатель на структуру должен, если я не ошибаюсь.
Проблема возникает, когда я создаю функцию, которая принимает канал типа chan Hashable
, и пытаюсьпередать в chan *Transaction
, например:
func consume(c chan Hashable) {
// Do something with the elements from c
}
func main() {
var c2 chan *Transaction
consume(c2)
}
(я создал небольшой пример, чтобы показать эту проблему на Playground )
Я мог бы, конечно, создатьновая структура, которая перепаковывает поля, которые нужны consume
, но кажется, что это гораздо худший вариант.
Есть ли для этого чистое решение?