Golang中,函数也可以作为一个变量来使用。
写一个普通函数来让一段字符串,实现大小写交替显示:
func processCase1(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 stringToCase1(str string, myfunc func(string) string) string {
return myfunc(str)
}
这时在main()里运行stringToCase1()函数,并将上面processcase1()函数作为参数变量使用:
fmt.Println(stringToCase1(str, processCase1))
进一步简化stringToCase1(),使用type关键字让函数变成一个自定义类型。
PS:一般情况下会将type的自定义类型写在main()的上面。
type caseFunc func(string) string
func main() {
......
}
func stringToCase2(str string, myfunc caseFunc) string {
return myfunc(str)
}
这时在main()里运行stringToCase2()函数,并将上面processcase1()函数作为参数变量使用:
fmt.Println(stringToCase2(str, processCase1))
写一个判断奇偶数的例子:
先写一个判断奇数的函数,
func isEven(num int) bool {
if num%2 == 0 {
return true
}
return false
}
再写一个判断偶数的函数,
func isOdd(num int) bool {
if num%2 == 0 {
return false
}
return true
}
接着写一个过滤函数,这里的for循环计数变量不需要记录,所以使用了匿名变量。
func filter(arr []int, f myFunc) []int {
var result []int
for _, value := range arr {
if f(value) {
result = append(result, value)
}
}
return result
}
这样就完成了整个例子所要使用的函数,我们再将申请一个自定义类型,放在main()的上面,来实现所有功能。
type myFunc func(int) bool
func main() {
var nums = []int{10, 20, 30, 15, 17, 21, 33, 22, 57, 88, 99}
fmt.Println(filter(nums,isEven))
fmt.Println(filter(nums,isOdd))
}
最后得到结果:
[10 20 30 22 88]
[15 17 21 33 57 99]