Go语言函数变量(把函数作为值保存到变量中)
在Go语言中,函数也是一种类型,可以和其他类型(如 int32、float 等等)一样被保存在变量中。函数变量的使用方式如下所示。
下面在通过一个示例来演示一下函数变量的使用。
函数当作值和类型在写一些通用接口的时候非常有用,通过上面的例子可以看到 processFunc 这个类型是一个函数类型,然后两个 filter 函数的参数和返回值与 processFunc 类型是一样的。用户可以实现很多种逻辑,这样使得程序变得非常灵活。
声明:《Go系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。
package main
import (
"fmt"
"strings"
)
func main() {
result := StringToLower("AbcdefGHijklMNOPqrstUVWxyz", processCase)
fmt.Println(result)
result = StringToLower2("AbcdefGHijklMNOPqrstUVWxyz", processCase)
fmt.Println(result)
}
// 处理字符串,奇数偶数依次显示为大小写
func processCase(str string) string {
result := ""
for i, value := range str {
if i%2 == 0 {
result += strings.ToUpper(string(value))
} else {
result += strings.ToLower(string(value))
}
}
return result
}
func StringToLower(str string, f func(string) string) string {
fmt.Printf("%T \n", f)
return f(str)
}
type caseFunc func(string) string //声明了一个函数类型,通过 type 关键字,caseFunc 会形成一个新的类型
func StringToLower2(str string, f caseFunc) string {
fmt.Printf("%T \n", f) // 打印变量f的类型
return f(str)
}
运行结果如下:
func(string) string
AbCdEfGhIjKlMnOpQrStUvWxYz
main.caseFunc
AbCdEfGhIjKlMnOpQrStUvWxYz
下面在通过一个示例来演示一下函数变量的使用。
package main
import "fmt"
type procesFunc func(int) bool // 声明了一个函数类型
func main() {
slice := []int{1, 2, 3, 4, 5, 7}
fmt.Println("slice = ", slice)
odd := filter(slice, isOdd) // 函数当作值来传递
fmt.Println("奇数元素:", odd)
even := filter(slice, isEven) // 函数当作值来传递
fmt.Println("偶数元素:", even)
}
//判断元素是否是偶数
func isEven(integer int) bool {
if integer%2 == 0 {
return true
}
return false
}
//判断元素是否是奇数
func isOdd(integer int) bool {
if integer%2 == 0 {
return false
}
return true
}
//根据函数来处理切片,根据元素奇数偶数分组,返回新的切片
func filter(slice []int, f procesFunc) []int {
var result []int
for _, value := range slice {
if f(value) {
result = append(result, value)
}
}
return result
}
运行结果如下:
slice = [1 2 3 4 5 7]
奇数元素: [1 3 5 7]
偶数元素: [2 4]
- 定义一个函数类型;
- 实现定义的函数类型;
- 作为参数调用。
函数当作值和类型在写一些通用接口的时候非常有用,通过上面的例子可以看到 processFunc 这个类型是一个函数类型,然后两个 filter 函数的参数和返回值与 processFunc 类型是一样的。用户可以实现很多种逻辑,这样使得程序变得非常灵活。
声明:《Go系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。