Существует ограничение системы типов, которое препятствует общему решению (или, по крайней мере, делает его очень неэффективным).
Например, тела RGBA.Opaque и NRGBA.Opaque идентичны, поэтому выя бы подумал, что они могут быть преобразованы в третью функцию с такой сигнатурой:
func opaque(pix []Color, stride int, rect Rectangle) bool
Вы бы хотели вызвать эту функцию следующим образом:
func (p *RGBA) Opaque() bool {
return opaque([]Color(p.Pix), p.Stride, p.Rect)
}
Ноты не можешьp.Pix не может быть преобразован в [] Color, потому что эти типы имеют разные представления в памяти, и спецификация запрещает это.Мы могли бы выделить новый фрагмент, преобразовать каждый отдельный элемент p.Pix и передать его, но это было бы очень неэффективно.
Обратите внимание, что RGBAColor и NRGBAColor имеют точно такую же структуру.Возможно, мы могли бы выделить функцию только для этих двух типов, поскольку представление в пикселях срезов в памяти точно такое же:
func opaque(pix []RGBAColor, stride int, rect Rectangle) bool
func (p *NRGBA) Opaque() bool {
return opaque([]RGBAColor(p.Pix), p.Stride, p.Rect)
}
Увы, опять же, это не разрешено.Похоже, это скорее проблема спецификации / языка, чем технической.Я уверен, что это уже упоминалось в списке рассылки, но я не могу найти хорошее обсуждение этого вопроса.
Это похоже на область, где дженерики пригодятся, но нет решения для дженериковна ходу пока.