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