开发平台
开发工具:VSCode
Go版本:1.21.7 Winsows 64位
一、break-label
package main
import "fmt"
func main() {
label1:
for i := 0; i < 4; i++ {
for j := 0; j < 10; j++ {
if j == 2 {
// break // 默认情况下会跳出最近的for循环
break label1 // break后面可以指定标签,跳出标签对应的for循环
}
fmt.Println("j=", j)
}
}
}
二、返回多个值
1. 方式1
package main
import "fmt"
func getSumAndSub(n1 int, n2 int) (int, int) {
sum := n1 + n2
sub := n1 - n2
return sum, sub
}
func main() {
sum, sub := getSumAndSub(5, 3)
fmt.Printf("sum=%v, sub=%v", sum, sub)
}
2. 方式2
package main
import "fmt"
func getSumAndSub(n1 int, n2 int) (sum int, sub int) {
sum = n1 + n2
sub = n1 - n2
return
}
func main() {
sum, sub := getSumAndSub(5, 3)
fmt.Printf("sum=%v, sub=%v", sum, sub)
}
三、可变参数
package main
import "fmt"
func sum(n1 int, args ...int) int {
sum := n1
// 遍历args
for i := 0; i < len(args); i++ {
// args[i]表示取出args切片的第i个元素值
sum += args[i]
}
return sum
}
func main() {
res := sum(10, 0, -1, 90, 10)
fmt.Println("res=", res)
}
四、匿名函数
1. 直接调用
package main
import "fmt"
func main() {
// 在定义匿名函数时直接调用,这种方式匿名函数只能调用一次
res := func(n1 int, n2 int) int {
return n1 + n2
}(10, 20)
fmt.Println("res=", res)
}
2. 赋值给变量
package main
import "fmt"
func main() {
// 将匿名函数func(n1 int, n2 int) int 赋给 a 变量
// 则 a 的数据类型为函数类型,此时,可以通过 a 完成调用
a := func(n1 int, n2 int) int {
return n1 + n2
}
res1 := a(10, 20)
fmt.Println("res1=", res1)
res2 := a(10, 20)
fmt.Println("res2=", res2)
}
3. 全局匿名函数
package main
import "fmt"
var (
Func1 = func(n1 int, n2 int) int {
return n1 + n2
}
)
func main() {
res := Func1(10, 20)
fmt.Println("res1=", res)
}
五、闭包
问题:
代码:
package main
import (
"fmt"
"strings"
)
func makeSuffix(suffix string) func(string) string {
// suffix与返回的函数组成一个闭包
// 相当于makeSuffix是一个类,suffix是类里的变量,返回的匿名函数是类里的函数
return func(name string) string {
// 如果name没有指定的后缀,则加上,否则就返回原来的名字
if !strings.HasSuffix(name, suffix) {
return name + suffix
}
return name
}
}
func main() {
f := makeSuffix(".jpg") // 只用传一次
fmt.Println("文件名处理后=", f("winter")) // winter.jpg
fmt.Println("文件名处理后=", f("bird.jpg")) // bird.jpg
}