Так что Go не позволяет вам делать динамические типы, как это. Поэтому, если вы хотите, чтобы ваш код работал с mytype
, попробуйте это:
package main
import (
"fmt"
"reflect"
)
//Reverse reverses a slice.
func Reverse(slice *[]mytype) {
s := reflect.ValueOf(slice)
if s.Kind() != reflect.Ptr {
panic("Must be a pointer")
}
sliceLen := s.Elem().Len()
sliceType := *slice
for left, right := 0, sliceLen-1; left < right; left, right = left+1, right-1 {
sliceType[left], sliceType[right] = sliceType[right], sliceType[left]
}
s.Elem().Set(reflect.ValueOf(sliceType))
}
type mytype int
func main() {
var slice = []mytype{11, 22, 33, 44}
Reverse(&slice)
fmt.Println("RESULT", slice) // RESULT [44 33 22 11]
}
Тем не менее, вы можете подумать: «ну, мне нужно поменять много разных типов ломтиков ...». Ну иди, ты там тоже прикрыл!
Выезд sort.Reverse .
Пакет sort предлагает интересный шаблон, который многие суслики используют, чтобы обойти отсутствие шаблонов / шаблонов на ходу. Целью шаблона является использование интерфейсов и добавление методов к этим интерфейсам для изменения базовых данных. Таким образом, каждая реализация интерфейса знает тип, но метод получения не должен заботиться.