我需要創建一個將任何型別陣列作為引數的函式。
package main
import "fmt"
type flt func(interface{}) bool
func filter(sl []interface{}, f flt) (filtered []interface{}) {
// todo call flt to each element on array
return
}
func f1(interface{}) bool{
return true
}
func main() {
slice := []int{1, 2, 3, 4, 5, 7}
filter(slice, f1)
}
./prog.go:16:8: cannot use slice (type []int) as type []interface {} in argument to filter
我創立了這個問題,但該解決方案不適用于陣列。
編輯1。順便說一句,您可能注意到了,但我正在嘗試為任何陣列創建一個“映射函式”,就像 JS array.filter()
uj5u.com熱心網友回復:
我對 Interface{} 的使用是錯誤的。我不需要說它是一個陣列,只是一個常規的 Interface{} 能夠接收任何型別的切片。
就像 icza 說我使用反射來獲取 Interface{} 的型別,但是通過使用“reflect.TypeOf(el).Kind() != reflect.Slice”,我避免了手動型別處理程式并像我一樣獲得我的一般功能通緝。
package main
import (
"errors"
"reflect"
)
type flt func(interface{}) bool
func filter(el interface{}, f flt) (filtered interface{}, err error) {
if reflect.TypeOf(el).Kind() != reflect.Slice {
err = errors.New("Passed element is not an slice")
filtered = el
return
}
// todo -> apply flt to each element from array
return
}
func f1(interface{}) bool {
return true
}
func main() {
slice := []int{1, 2, 3, 4, 5, 7}
slice2 := []string{"1", "2", "a"}
filter(slice, f1)
filter(slice2, f1)
filter(1, f1)
}
也檢查一下: 如何檢查 interface{} 是否為切片
uj5u.com熱心網友回復:
您仍然可以使用反射
package main
import (
"fmt"
"reflect"
)
type flt func(interface{}) bool
func filter(sl interface{}, f flt) interface{} {
v := reflect.ValueOf(sl)
filtered := reflect.MakeSlice(v.Type(), 0, v.Len()-1)
for i := 0; i < v.Len(); i {
if f(v.Interface()) {
filtered = reflect.Append(filtered, v.Index(i))
}
}
return filtered.Interface()
}
func f1(interface{}) bool {
return true
}
func main() {
slice := []int{1, 2, 3, 4, 5, 7}
filtered := filter(slice, f1)
for _, v := range filtered.([]int) {
fmt.Printf("Filtered value: %v\n", v)
}
}
https://go.dev/play/p/hmzgUD8ceb1
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/405677.html
標籤:
下一篇:在Django模型的情況下,
