侧边栏壁纸
博主头像
秋码记录

一个游离于山间之上的Java爱好者 | A Java lover living in the mountains

  • 累计撰写 137 篇文章
  • 累计创建 297 个标签
  • 累计创建 45 个分类

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

在前面几篇文章,我们一直在使用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", "仗剑行于江湖,执笔记江湖事。")
}

img

说到底,可变参数...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)
}

img

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

img

Go 语言中的函数变量与匿名函数(Let's Go 二十)
« 上一篇 2022-10-04
Go 语言中的延迟执行【defer】(Let's Go 二十二)
下一篇 » 2022-10-12

相关推荐