Я не могу понять, как реализовать алгоритм, который будет работать на любом типе.
В следующем коде будут появляться ошибки, пытающиеся преобразовать строку или типизированный фрагмент в интерфейсы, и вы не можете сравнивать интерфейс {} objects: invalid operation: result[0] > result[n - 1] (operator > not defined on interface)
func main() {
c := Algo("abc")
//...
c := Algo([3]int{1,2,3})
//...
}
func Algo(list []interface{}) chan []interface{} {
n := len(list)
out := make(chan []interface{})
go func () {
for i := 0; i < n; i++ {
result := make([]interface{}, n)
copy(result, list)
// an actually useful algorithm goes here:
if (result[0] > result[n-1]) {
result[0], result[n-1] = result[n-1], result[0]
}
out <- result
}
close(out)
}()
return out
}
Хотя это боль (я думаю, что она должна быть автоматической), я могу вручную вставить и набрать набранные фрагменты в интерфейс {} s, настоящая проблема выше - это сравнение. И он просто становится все более и более глупым.
a := [3]int{1,2,3}
b := make([]interface{}, len(a))
for i, _ := range a {
b[i] = a[i]
}
Я даже думал об использовании vector.Vector, но так много людей говорят, что никогда не использовать их.
Так должен ли я просто реализовать тот же алгоритм для int slices и строк? Как насчет фрагментов myObject? Я могу создать интерфейс с настраиваемой функцией func, но как мне заставить его работать со стандартными типами?