Исходники и презентации
This commit is contained in:
32
lessons/generics_and_reflection/reflect_generic/main.go
Normal file
32
lessons/generics_and_reflection/reflect_generic/main.go
Normal file
@ -0,0 +1,32 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"reflect"
|
||||
)
|
||||
|
||||
func InvertSlice(args []reflect.Value) []reflect.Value {
|
||||
inSlice, length := args[0], args[0].Len()
|
||||
outSlice := reflect.MakeSlice(inSlice.Type(), 0, length)
|
||||
for idx := length - 1; idx >= 0; idx-- {
|
||||
element := inSlice.Index(idx)
|
||||
outSlice = reflect.Append(outSlice, element)
|
||||
}
|
||||
|
||||
return []reflect.Value{outSlice}
|
||||
}
|
||||
|
||||
func Bind(value interface{}, fn func([]reflect.Value) []reflect.Value) {
|
||||
invert := reflect.ValueOf(value).Elem()
|
||||
invert.Set(reflect.MakeFunc(invert.Type(), fn))
|
||||
}
|
||||
|
||||
func main() {
|
||||
var invertInts func([]int) []int
|
||||
Bind(&invertInts, InvertSlice)
|
||||
fmt.Println(invertInts([]int{2, 3, 5}))
|
||||
|
||||
var invertStrs func([]string) []string
|
||||
Bind(&invertStrs, InvertSlice)
|
||||
fmt.Println(invertStrs([]string{"C++", "Go"}))
|
||||
}
|
||||
Reference in New Issue
Block a user