跳到主要内容

Go 匿名函数

提示
  1. 匿名函数定义:在 Go 中,匿名函数是没有名称的函数,通过变量分配调用,如 var greet = func() { ... },然后使用 greet() 来调用。
  2. 参数和返回值:匿名函数可以接受参数并返回值,类似于常规函数。例如 var sum = func(n1, n2 int) int { return n1 + n2 } 可以接受整数参数并返回它们的和。
  3. 作为参数或返回值:匿名函数可用作其他函数的参数或从其他函数返回。例如,可将匿名函数作为参数传递给 findSquare() 函数,或者从函数如 displayNumber() 中返回匿名函数。

在 Go 中,我们可以创建没有函数名的函数,称为匿名函数。例如,

func () {
fmt.Println("没有名称的函数")
}

上述函数是一个有效的函数,它打印 "没有名称的函数"。它的工作方式就像一个普通的 Go 函数

Go 匿名函数的工作原理

由于匿名函数没有任何名称,您可能会想知道我们如何调用该函数。

通常,我们所做的是将匿名函数赋值给一个变量,然后使用该变量名来调用函数。例如,

// 匿名函数
var greet = func (){
// 代码
}

// 函数调用
greet()

这里,你可以看到我们使用变量名 greet 来调用函数。

示例:Go 匿名函数

package main
import "fmt"

func main() {

// 匿名函数
var greet = func() {
fmt.Println("你好,你好吗")
}

// 函数调用
greet()

}

输出

你好,你好吗

这里,我们将匿名函数赋值给变量 greet 并使用 greet() 来调用函数。

带参数的匿名函数

像普通函数一样,匿名函数也可以接受函数参数。例如,

// 程序传递参数到匿名函数

package main
import "fmt"

func main() {

// 带参数的匿名函数
var sum = func(n1, n2 int) {
sum := n1 + n2
fmt.Println("和是:", sum)
}

// 函数调用
sum(5, 3)

}

输出

和是: 8

这里,匿名函数接受两个整数参数 n1 和 n2。

func(n1, n2 int) {
...
}

由于我们将匿名函数赋值给了 sum 变量,我们使用变量名来调用函数。

sum(5, 3)

这里,53 是传递给函数的值。

从匿名函数返回值

像普通函数一样,我们也可以从匿名函数返回值。例如,

// 程序从匿名函数返回值

package main
import "fmt"

func main() {

// 匿名函数
var sum = func(n1, n2 int) int {
sum := n1 + n2

return sum
}

// 函数调用
result := sum(5, 3)

fmt.Println("和是:", result)

}

输出

和是: 8

这里,我们将匿名函数 func(n1,n2 int) int 赋值给 sum 变量。该函数计算 n1 和 n2 的和并返回。

示例:从匿名函数返回值

// 程序返回矩形面积

package main
import "fmt"

func main() {

// 匿名函数
area := func(length, breadth int) int {
return length * breadth
}

// 使用变量名调用函数
fmt.Println("矩形面积是", area(3,4))

}

输出

矩形面积是 12

在上述程序中,我们定义了一个匿名函数并将其赋值给变量 area。矩形的面积 length * breadth (3 * 4) 被返回给 area。

作为参数传递给其他函数的匿名函数

在 Go 中,我们还可以将匿名函数作为参数传递给其他函数。在这种情况下,我们传递包含匿名函数的变量。例如,

package main
import "fmt"

var sum = 0

// 计算数字平方的普通函数
func findSquare(num int) int {
square := num * num
return square
}

func main() {

// 匿名函数返回数字之和
sum := func(number1 int, number2 int) int {
return number1 + number2
}

// 函数调用
result := findSquare(sum(6, 9))
fmt.Println("结果是:", result)

}

输出

结果是: 225

在上述示例中,我们创建了两个函数:

  • 一个匿名函数,用于找到两个数字的和
  • 一个普通函数 findSquare(),用于找到一个数字的平方。

注意 main() 中的函数调用

result := findSquare(sum(6, 9))

这里,我们将匿名函数作为参数传递给了 findSquare() 函数。

匿名函数返回两个参数的和。然后将这个和传递给 findSquare() 函数,后者返回和的平方。

因此,在我们的程序中,匿名函数首先返回 69 的和,即 15

然后这个值传递给 findSquare() 函数,它返回 15 的平方,即 225

在 Go 中返回匿名函数

我们也可以在 Go 中返回一个匿名函数。为此,我们需要在普通函数内部创建一个匿名函数并返回它。例如,

// 程序返回匿名函数

package main
import "fmt"

// 返回匿名函数的函数
func displayNumber() func() int {

number := 10
return func() int {
number++
return number
}
}

func main() {

a := displayNumber()

fmt.Println(a())

}

输出

11

在上述程序中,注意 displayNumber() 函数中的这一行,

func displayNumber() func() int {

这里,func() 表示 displayNumber() 返回一个函数,而 int 表示匿名函数返回一个整数。注意 displayNumber() 是一个普通函数。

displayNumber() 函数内部,我们创建了一个匿名函数。

return func() int {

}

这里,我们返回了匿名函数。因此,当调用 displayNumber() 函数时,匿名函数也被调用,并返回递增的数字。