Как мога да накарам функцията RemoveDead
да приема други части от интерфейси (или може би дори части от структурни указатели), които имплементират Liver
с малко въздействие върху производителността?
Струва ми се, че функцията ще трябва да приеме interface{}
като аргумент и да прави преобразувания по време на изпълнение, но не съм сигурен как да направя преобразуванията. Бих предположил също, че правенето на x.(Liver)
е много по-бавно от Liver(x)
, защото последното е преобразуване на времето за компилиране.
Най-доброто решение ли е да копирате и поставите функцията и да промените аргумента и типа на връщане във всяко копие? Ще са необходими само три или четири копия, но все пак ще изглежда като много тромаво решение.
type Updater interface {
Liver
Update() bool
}
type Liver interface {
Alive() bool
}
func RemoveDead(all []Updater) []Updater {
for i := len(all) - 1; i >= 0; i-- {
if Liver(all[i]).Alive() == false {
all[i] = all[len(all)-1]
all = all[:len(all)-1]
}
}
return all
}