【韩顺平Go核心编程】练习题(三)


开发平台

开发工具: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
}

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值