go语言学习笔记 — 函数:匿名函数 —— 没有函数名的函数

Posted Locutus

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go语言学习笔记 — 函数:匿名函数 —— 没有函数名的函数相关的知识,希望对你有一定的参考价值。

go语言支持匿名函数,即在需要使用函数时,再定义函数。


1. 匿名函数没有函数名,只有函数体

  • 声明匿名函数
func (参数列表) (返回参数列表) {
    函数体
}
  • 在声明时调用匿名函数
func (data int) {
    fmt.Println("hello", data)
}(100)  // (100)表示对匿名函数进行调用,向匿名函数传参100

2. go函数可以作为值,保存在变量中。匿名函数经常以变量形式传递

  • 匿名函数体可以被赋值到变量
f := func (data int) {
    fmt.Println("hello", data)
}

// 使用f()调用
f(100)

匿名函数本身是一种值,可以方便地保存在各种容器中,实现回调和操作封装。

  • 匿名函数实现回调、闭包等
package main

import (
	"fmt"
)

// 使用visit函数封装切片遍历过程,其中的value作为回调函数f的入参,进行相应操作
func visit(list []int, f func(int)) {
	for _, v := range list {
		f(v)
	}
}

// 切片[]int{1, 2, 3, 4}作为visit函数的入参
func main() {
	visit([]int{1, 2, 3, 4}, func(v int) { // 声明匿名函数,作用是打印入参
		fmt.Println(v)
	})
}

go的strings包中也有回调函数设计

func TriFunc (s string, f func(rune) bool) string {
    return TriRightFunc (TrimLeftFunc(s, f), f)
}
  • 匿名函数实现操作封装

把匿名函数作为map的值,通过命令行参数动态调用匿名函数。

package main

import (
	"flag"
	"fmt"
)

// 定义命令行参数--skill,把命令行传入字符串赋给指针变量skillParam 
var skillParam = flag.String("skill", "", "skill to perform")

func main() {
	flag.Parse() // 解析命令行参数,完成后,指针变量skillParam指向命令行传入的值 
	
	var skill = map[string]func(){
		"fire": func() { fmt.Println("chicken fire") }, // 匿名函数作为map的值
		"run":  func() { fmt.Println("soldier run") },
		"fly":  func() { fmt.Println("angel fly") },
	}

	if f, ok := skill[*skillParam]; ok {   // skillParam是一个*string类型的指针变量,使用*skillParam获取命令行传入参数作为key,从map中取出对应的value,即匿名函数
		f()  // 调用对应匿名函数
	} else {
		fmt.Println("skill not found")
	}
}

/*
# go run --skill fly

angel fly
*/

以上是关于go语言学习笔记 — 函数:匿名函数 —— 没有函数名的函数的主要内容,如果未能解决你的问题,请参考以下文章

Golang之匿名函数和闭包

Go语言自学系列 | golang匿名函数

GO学习笔记 - 函数名前面是否有输入参数肯定是不一样的!!

go 笔记

go基础笔记

go 匿名函数和闭包