2 回答
TA贡献1829条经验 获得超13个赞
所以这里有一个使用反射的答案,我想这不会太难看。
package main
import (
"fmt"
"reflect"
)
type onEach func(x interface{})
func printString(x interface{}) {
xx := x.(string)
fmt.Printf("x is a string '%s'\n", xx)
}
func printInt(x interface{}) {
xx := x.(int)
fmt.Printf("x is an int '%d'\n", xx)
}
func forEach(y interface{}, onEach onEach) {
// code to ensure y is a slice omitted
v := reflect.ValueOf(y)
for i := 0; i < v.Len(); i++ {
onEach(v.Index(i).Interface())
}
}
func main() {
s := []string{"foo", "bar"}
i := []int{1, 2, 3}
forEach(s, printString)
forEach(i, printInt)
}
TA贡献1811条经验 获得超4个赞
使用反射包在任意类型的切片上编写迭代函数:
// forEach calls f for each element of slice s.
// The function f must have a single argument with
// the same type as the slice's element type.
func forEach(s interface{}, f interface{}) {
sv := reflect.ValueOf(s)
fv := reflect.ValueOf(f)
for i := 0; i < sv.Len(); i++ {
fv.Call([]reflect.Value{sv.Index(i)})
}
}
像这样使用它:
func printString(s string) {
fmt.Printf("x is a string %q\n", s)
}
s := []string{"foo", "bar"}
forEach(s, printString)
此答案与问题中的代码和另一个答案不同,因为该函数不需要使用类型评估。f
- 2 回答
- 0 关注
- 111 浏览
添加回答
举报