Go 语言中的闭包和可变参数(Let‘s Go 二十一)

1、可变参数

在前面几篇文章,我们一直在使用Println、Printf函数,你可能没有特别注意到,就是我们可以传入任意参数。而这种可以接受任意实参的函数,函数的形参极有可能是可变参数,使用...type可声明可变参数,但必须是形参列表的最后一个。

package main

import (
	"fmt"
)

func site(strs ...string) {
	for _, val := range strs {
		fmt.Println(val)
	}
}

func main() {
	site("秋码记录", "https://qiucode.cn", "仗剑行于江湖,执笔记江湖事。")
}

在这里插入图片描述

说到底,可变参数...type·内部就是切片 []type,若将上述可变形参改用切片,其最终效果是一样的,这只是一种语法糖。

func site(strs []string) {
	for _, val := range strs {
		fmt.Println(val)
	}
}

细心的你可能早就发觉了,难道不是吗?以上...type是可以传入任意数量的参数,但是很明显,传入的参数收到了约束。

如果想传入任意类型的可变参数,那又该怎么解决呢?

其实,可以指定类型为后续会讲到的空接口 interfave {},即可传入任意类型。

package main

import (
	"fmt"
)

func pramType(args ...interface{}) {
	for _, val := range args {
		switch val.(type) {
		case int:
			fmt.Println(val, " 哟呵,传入的是 整型 啊!")
		case string:
			fmt.Println(val, " 这可是 字符串 哟!")
		default:
			fmt.Println(val, " 暂且归为其他吧!")
		}
	}
}

func main() {

	pramType("https://qiucode.cn", 4, 3.14)
}

在这里插入图片描述

2、闭包

Go闭包是一个函数值,可以引用其函数体外的变量,也就是可以访问或赋予该引用变量的值。换句话讲,原本普通函数体变量的作用域是该普通函数结束,函数体内变量也就跟着销毁。然而,闭包把引用环境局部变量提升为全局变量,我们知道全局变量常驻内存污染全局。而闭包引用了引用环境变量后,使局部变量转为全局变量,且不会污染全局。

package main

import (
	"fmt"
)

func getVal() func() int {
	var value int //定义一个 整型 局部变量 value
	//返回一个闭包
	return func() int {
		value++
		return value
	}
}

func main() {

	val := getVal()

	fmt.Println(val())
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

甄齐才

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值