函数分类
没有参数, 没有返回值
// a 没有参数和返回值
func a() {}
有参数, 没有返回值
// b 参数类型不同
func b(a int, b string) {}
// c 参数类型相同, 类型简写
func c(a, b string) {}
有返回值
// d 确定返回值变量名和类型
func d(a int, b int) (ret int) {
// 在外层声明了ret, 所以可以直接使用
ret = a + b
return // 声明函数时制定了返回值为 ret, 所以直接 return ret 可以简写为 return
}
// e 有参数, 有返回值, 只确定返回值类型
func e(a int) int {
return 1
}
未知参数数量
func cal(a ...int) int {
ret := 0
for _,v := range a {
ret += v
}
return ret
}
// 当有固定参数和可变参数同时存在时, 先写固定参数, 再写可变参数
func cal2(a int, b ...int) int {
ret := a
for _,v := range b {
ret += v
}
}
多返回值
// 同样有多种写法
func cal(a, b, int) (int, int) {
sum := a+b
sub := a-b
return sum, sub
}
函数的作用域
package main
import "fmt"
var a = 100 // 函数外层需要使用var定义
var b = 99
func funcA() {
// 先从局部作用域找变量, 若有, 直接使用, 若没有, 找全局
a := 101
fmt.Println(a, b)
}
func main() {
funcA() // 101 99
}
函数的进阶
参数为函数
package main
import "fmt"
func sum(x, y int) int {
return x + y
}
func sub(x, y int) int {
return x - y
}
// 定义一个函数, 函数作为参数
func cal(x, y int, z func(int, int) int) int { // 需要将作为参数的函数的参数类型和返回值类型都声明清楚
return z(x, y)
}
func main() {
ret1 := cal(1, 2, sum)
fmt.Println(ret1)
ret2 := cal(2, 1, sub)
fmt.Println(ret2)
}
匿名函数
// 没有名字的函数, 无法使用 funcName() 调用
// 使用方式1, 将函数赋值给变量
// 定义
noneFunc := func() {
fmt.Println("noneFunc")
}
// 使用
noneFunc()
// 使用方式2, 匿名函数末尾+(), 直接使用
func() {
fmt.Println("noneFunc")
}()
闭包
package main
// 闭包 = 外层变量的引用 + 返回值为匿名函数
func a(name string) func() {
return func() {
fmt.Println("hello", name)
}
}
func main() {
// 使用闭包, 方式1
a("Tim")()
// 方式2
r := a("Tim")
r()
}
闭包的练习
package main
// 检查文件名的后缀, 如果没有.txt, 则添加并返回
import (
"fmt"
"strings"
)
// 没使用闭包
func check(filename, suffix string) string {
if !strings.HasSuffix(filename, suffix) {
filename = filename + ".txt"
}
return filename
}
// 使用闭包
func check1(filename, suffix string) func() string {
return func() string {
if !strings.HasSuffix(filename, suffix) {
filename = filename + ".txt"
}
return filename
}
}
func main() {
// 检查文件名结尾是否为".txt", 若不是添加到末尾
fmt.Println(check("at", "txt"))
fmt.Println(check1("abc", ".txt")())
}
版权声明:本文为yang_kaiyue原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。