标签:前缀 efi 自然语言 字符串切片 turn 而且 fun ESS 处理
函数变量是把函数作为值保存到变量中.
在Golang中,,函数也是一种类型,可以和其他类型一样被保存在变量中.例如:
package main
// 将函数作为值保存到变量中
import (
"fmt"
)
func fire() {
fmt.Println("fire")
}
func main(){
f := fire() // 将变量f声明为func()类型,此时f就被俗称为“回调函数”, 此时f的值为nil
f()
}
链式调用
是一个泛概念,到底是什么东西的链式调用不明确。
函数的返回值是一个函数时,函数也能链式调用;
函数的返回值是一个对象时,直接调用返回值中对象的方法也是链式调用。
但是前者(1)显然是没有意义的。真正有意义的链式调用是后者(2),也就是方法链(method chaining)。方法链这个词是有的,而且使用的很广泛。其实很多人口中的
链式调用
实际上就是指方法链。但是链式调用
这个词语还可以描述函数调用链,所以让它自身的存在价值变得难以理解。链式调用的优点:
- 让调用过程更接近自然语言。
- 把原本参数列表复杂的方法化作多个参数列表简单的方法来使用。
- 减少不必要的代码量。
在jQuery中很多东西就是使用了方法链的概念,那么在Golang中链式调用是怎么样的呢?
链式调用很好的体现了: 操作与数据分离的设计
字符串处理函数(StringProccess)需要外部提供数据源: 一个字符串切片(list []string), 另外还需要提供一个链式处理函数的切片(chain []func(string) string)
字符串链式处理设计思路:
package main
import (
"fmt"
"strings"
)
// StringProccess 字符串处理函数,传入字符串切片和处理链
func StringProccess(list []string, chain []func(string) string) {
// 遍历每一个字符串
for index, str := range list {
// 第一个需要处理的字符串
result := str
// 遍历每一个处理链
for _, proc := range chain {
// 输入一个字符串进行处理,返回数据作为下一个处理链的输入
result = proc(result)
}
// 将结果放回切片
list[index] = result
}
}
// 自定义处理函数
// 处理链函数即可以是系统提供的处理函数,也可以使用自定义的函数
// 自定义移除前缀的处理函数
func removePrefix(str string) string {
return strings.TrimPrefix(str, "go")
}
func main() {
// 提供待处理的字符串列表
list := []string{
"go scanner",
"go parser",
"go compiler",
"go printer",
"go formater",
}
// 处理函数链
chain := []func(string) string {
removePrefix,
strings.TrimSpace,
strings.ToUpper,
}
// 处理字符串
StringProccess(list, chain)
// 输出处理好的字符串
for _, str := range list {
fmt.Printf(str)
}
}
标签:前缀 efi 自然语言 字符串切片 turn 而且 fun ESS 处理
原文地址:https://www.cnblogs.com/vinsent/p/11221486.html