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())
}