packagemainimport"fmt"funcsimple() func(a, b int) int { f :=func(a, b int) int {return a + b }return f}funcmain() { s :=simple() fmt.Println(s(60, 7))}
packagemainimport"fmt"funcappendStr() func(string) string { t :="Hello" c :=func(b string) string { t = t +" "+ breturn t }return c}funcmain() { a :=appendStr() fmt.Println(a("World")) fmt.Println(a("Gopher"))}
packagemainimport"fmt"var g ="Hi"funcappendStr() func(string) string { t :="Hello" g = g +" "+"Hi" c :=func(b string) string { t = t +" "+ b + greturn t }return c}funcmain() { a :=appendStr() b :=appendStr() fmt.Println(a("World")) fmt.Println(b("Everyone")) fmt.Println(a("Gopher")) fmt.Println(b("!"))}
这里我们在函数appendStr外部定义了一个变量g,因此g位于函数appendStr的作用域链上。调用appendStr可以访问到其作用域链上的g,第一次调用appendStr后g更新为Hi Hi,第二次调用后g更新为Hi Hi Hi。该程序输出为:
Hello WorldHi Hi Hi
Hello EveryoneHi Hi Hi
Hello WorldHi Hi Hi GopherHi Hi Hi
Hello EveryoneHi Hi Hi !Hi Hi Hi
typestudentstruct { firstName string lastName string grade string country string}
下面实现函数filter,入参为一个切片列表,一个过滤条件判断函数。
funcfilter(s []student, f func(student) bool) []student {var s []studentfor _, v :=range s {iff(v) { r =append(r, v) } }}
下面是完成程序:
packagemainimport"fmt"typestudentstruct { firstName string lastName string grade string country string}funcfilter(s []student, f func(student) bool) []student {var r []studentfor _, v :=range s {iff(v) { r =append(r, v) } }return r}funcmain() { s1 :=student{ firstName: "Naveen", lastName: "Ramanathan", grade: "A", country: "India", } s2 :=student{ firstName: "Samuel", lastName: "Johnson", grade: "B", country: "USA", } s := []student{s1, s2} f :=filter(s, func(s student) bool {return s.grade =="B" }) fmt.Println(f)}
我们定义了两个student结构体变量,然后通过filter函数过滤出了grade为B的student。输出为:[{Samuel Johnson B USA}]。
假设我们现在像过滤出来自India,即印度的同学,那么只需要把过滤判断函数改为如下即可:
f :=filter(s, func(s student) bool {return s.country =="India"})fmt.Println(f)
是不是很方便好用?
下面我们再实现一个函数iMap,用来遍历处理一个int类型的切片,并返回处理后的切片。
packagemainimport"fmt"funciMap(s []int, f func(int) int) []int {var r []intfor _, v :=range s { r =append(r, f(v)) }return r}funcmain() { a := []int{5, 6, 7, 8, 9} r :=iMap(a, func(n int) int {return n *5 }) fmt.Println(r)}