Golang支持頭等函數(shù)的機制坠狡。
頭等函數(shù):支持頭等函數(shù)的編程語言,可以把函數(shù)賦值給變量遂跟,也可以把函數(shù)作為其他函數(shù)的參數(shù)或返回值逃沿。
匿名函數(shù)
func main(){
a:=func(){
fmt.Println("Hello World!")
}
a()
fmt.Printf("%T",a)
}
- 這是把函數(shù)賦值給變量的語法,給a賦值的函數(shù)沒有函數(shù)名稱幻锁,這類函數(shù)稱為匿名函數(shù)凯亮。
2.調用該函數(shù)的唯一方式就是使用變量a。打印出的a的類型是func()哄尔。
3.要調用一個匿名函數(shù)且不賦值給變量假消,可以這樣寫:
package main
import(
"fmt"
)
func main(){
func(){
fmt.Println("hello world!")
}()
}
自定義的函數(shù)類型
就是取別名,這樣寫
type add func(a int, b int)int
創(chuàng)建的新的函數(shù)類型就是add岭接,參數(shù)是兩個int變量富拗,返回一個int類型。
add新函數(shù)類型的定義和使用:
package main
import(
"fmt"
)
type add func(a int, b int)int
func main(){
var a add = func(a int ,b int) int{
return a+b
}
s := a(5, 6)
fmt.Println(s)
}
高階函數(shù)
滿足下列條件之一的函數(shù)就是高階函數(shù):
1.接收一個或多個函數(shù)作為參數(shù)
2.返回值就是一個函數(shù)
函數(shù)作為其他函數(shù)的參數(shù)
func simple(a func(a, b int) int) { fmt.Println(a(60, 7))
}
func main() {
f := func(a, b int) int {
return a + b }
simple(f)
}
函數(shù)作為返回值
func simple() func(a, b int) int {
f := func(a, b int) int {
return a + b
}
return f
}
func main() {
s := simple()
fmt.Println(s(60, 7))
}
閉包
閉包是匿名函數(shù)的一個特例鸣戴。當一個匿名函數(shù)所訪問的變量定義在函數(shù)體外時啃沪,就稱這樣的匿名函數(shù)為閉包
package main
import ( "fmt"
)
func appendStr() func(string) string {
t := "Hello"
c := func(b string) string {
t=t+""+b
return t }
return c }
func main() {
a := appendStr()
b := appendStr()
fmt.Println(a("World"))
fmt.Println(b("Everyone"))
fmt.Println(a("Gopher"))
fmt.Println(b("!"))
}
頭等函數(shù)的實用
1.過濾一個students切片,篩選條件
選出grade是B的
type student struct { firstName string lastName string grade string country string
}
unc filter(s []student, f func(student) bool) []student {
var r []student
for _, v := range s {
if f(v) == true {
r = append(r, v)
} }
return r }
func main() {
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 {
if s.grade == "B" { return true
}
return false })
fmt.Println(f)
}
2.篩選India的student
c := filter(s, func(s student) bool {
if s.country == "India" {
return true
}
return false })
fmt.Println(c)