,如果你有预定义的类型一样[]int
或[]string
,不想转换为[]interface{}
看到这方面的工作示例代码(不使用reflect
):
package main
import "fmt"
func find(s []int, f func(int) bool) int {
for i, item := range s {
if f(item) {
return i
}
}
return -1
}
func findString(s []string, f func(string) bool) int {
for i, item := range s {
if f(item) {
return i
}
}
return -1
}
func main() {
s := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
fmt.Println(find(s, func(a int) bool { return a == 5 })) //5
strs := []string{"A", "B", "C"}
fmt.Println(findString(strs, func(a string) bool { return a == "B" })) //1
}
,或者您可以使用reflect
,像这样的工作示例代码:
package main
import "fmt"
import "reflect"
func find(slice interface{}, f func(interface{}) bool) int {
switch reflect.TypeOf(slice).Kind() {
case reflect.Slice:
values := reflect.Indirect(reflect.ValueOf(slice))
for i := 0; i < values.Len(); i++ {
if f(values.Index(i).Interface()) {
return i
}
}
}
return -1
}
func main() {
a := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
fmt.Println(find(a, func(i interface{}) bool { return i == 5 })) //5
b := []string{"A", "B", "C"}
fmt.Println(find(b, func(i interface{}) bool { return i == "B" })) //1
}
输出:
5
1
我希望这有助于。
答案将是泛型,但不去做泛型。所以有效地使用反射,编写* n * find_ [类型]函数或遍布各处的接口。到目前为止,这并不令人愉快。 – Jakumi
什么是数组?它们是任意的价值,还是它们需要比较的具体类型? – 2016-07-22 19:27:16
@squint数组是“标准”的。我有一个数组[] A和一个数组[] B(所有结构,而不是接口) – Thomas