package main
import"fmt"// 这个函数计算两个int型输入数据的和,并返回int型的和funcplus(a int, b int)int{// Go需要使用return语句显式地返回值return a + b
}funcmain(){// 函数的调用方式很简单// "名称(参数列表)"
res :=plus(1,2)
fmt.Println("1+2 =", res)}
32. Go 函数多返回值
Go 函数多返回值
package main
import"fmt"// 这个函数的返回值为两个intfuncvals()(int,int){return3,7}funcmain(){// 获取函数的两个返回值
a, b :=vals()
fmt.Println(a)
fmt.Println(b)// 如果你只对多个返回值里面的几个感兴趣// 可以使用下划线(_)来忽略其他的返回值_, c :=vals()
fmt.Println(c)}
33. Go 函数回调
Go支持函数回调,你可以把函数名称作为参数传递给另外一个函数,然后在别的地方实现这个函数。
package main
import"fmt"type Callback func(x, y int)intfuncmain(){
x, y :=1,2
fmt.Println(test(x, y, add))}//提供一个接口,让外部去实现functest(x, y int, callback Callback)int{returncallback(x, y)}funcadd(x, y int)int{return x + y
}
34. Go 函数命名返回值
函数接受参数。在 Go 中,函数可以返回多个“结果参数”,而不仅仅是一个值。它们可以像变量那样命名和使用。
package main
import"strings"import"fmt"// 返回t在vs中第一次出现的索引,如果没有找到t,返回-1funcIndex(vs []string, t string)int{for i, v :=range vs {for i, v :=range vs {if v == t {return i
}}return-1}// 如果t存在于vs中,那么返回true,否则falsefuncInclude(vs []string, t string)bool{returnIndex(vs, t)>=0}// 如果使用vs中的任何一个字符串作为函数f的参数可以让f返回true,// 那么返回true,否则falsefuncAny(vs []string, f func(string)bool)bool{for_, v :=range vs {iff(v){returntrue}}returnfalse}// 如果分别使用vs中所有的字符串作为f的参数都能让f返回true,// 那么返回true,否则返回falsefuncAll(vs []string, f func(string)bool)bool{for_, v :=range vs {if!f(v){returnfalse}}returntrue}// 返回一个新的字符串切片,切片的元素为vs中所有能够让函数f// 返回true的元素funcFilter(vs []string, f func(string)bool)[]string{
vsf :=make([]string,0)for_, v :=range vs {iff(v){
vsf =append(vsf, v)}}return vsf
}// 返回一个bool类型切片,切片的元素为vs中所有字符串作为f函数// 参数所返回的结果funcMap(vs []string, f func(string)string)[]string{
vsm :=make([]string,len(vs))for i, v :=range vs {
vsm[i]=f(v)}return vsm
}}funcmain(){// 来,试试我们的字符串切片操作函数var strs =[]string{"peach","apple","pear","plum"}
fmt.Println(Index(strs,"pear"))
fmt.Println(Include(strs,"grape"))
fmt.Println(Any(strs,func(v string)bool{return strings.HasPrefix(v,"p")}))
fmt.Println(All(strs,func(v string)bool{return strings.HasPrefix(v,"p")}))
fmt.Println(Filter(strs,func(v string)bool{return strings.Contains(v,"e")}))// 上面的例子都使用匿名函数,你也可以使用命名函数
fmt.Println(Map(strs, strings.ToUpper))}