당신은 []int
또는 []string
같은 미리 정의 된 유형을 가지고 (reflect
를 사용하지 않고)이 작업 예제 코드를 볼 []interface{}
로 변환하지 않으려는 경우 :
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
,536,
도움이되기를 바랍니다.
대답은 제네릭이지만 제네릭은 사용하지 않습니다. 따라서 효과적으로 리플렉션을 사용하고 * n * find_ [type] 함수를 작성하거나 모든 곳에서 인터페이스를 사용하여 걸어 다녀야합니다. 지금까지는별로 즐겁지 않습니다. – Jakumi
배열에 어떤 영향이 있습니까? 그것들은 임의의 값입니까, 아니면 비교할 필요가있는 특정 유형입니까? –
@squint 배열은 "표준"입니다. 배열 [] A 배열과 [] B 배열 (모든 구조체, 인터페이스가 아님) – Thomas