golang的slice支持func。使用func slice要注意func要完整描述入参出参。
如果需要执行一系列类型相同(入参出参格式相同)的函数,可以动态添加到一个slice里面。range slice顺序执行,也可并发执行,构造匿名goroutine,代码如下。
package main import ( "fmt" "time" ) func f1(Str string) bool { if len(Str) == 0 { return false } fmt.Println("f1 Str =", Str) return true } func f2(Str string) bool { if len(Str) == 0 { return false } fmt.Println("f2 Str =", Str) return true } func f3(Str string) bool { if len(Str) == 0 { return false } fmt.Println("f3 Str =", Str) return true } func main() { //函数的入参出餐类型个数,都需要明确:func(string) bool var FuncSlice []func(string) bool = []func(string) bool{f1, f2, f3} for _, v := range FuncSlice { go func(v func(string) bool) { if TempFlag := v("aaa"); TempFlag == true { } }(v) } time.Sleep(time.Second * 1) }
执行结果截图:
如果想对入参string也做一个切片,并发处理切片里的每个string类型对象,并且每个对象并发执行那些系列函数。代码如下:
func main() { //string类型切片,并发处理每个对象 var Strings []string = []string{"test1", "test2", "test3", "test4", "test5"} //函数的入参出餐类型个数,都需要明确:func(string) bool,并发执行每个函数 var FuncSlice []func(string) bool = []func(string) bool{f1, f2, f3} for _, String := range Strings { go func(String string) { for _, v := range FuncSlice { go func(v func(string) bool) { if TempFlag := v(String); TempFlag == true { } }(v) } }(String) } time.Sleep(time.Second * 1) }
执行结果: