前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go高阶21,语法糖规则,可别掉入陷阱

Go高阶21,语法糖规则,可别掉入陷阱

作者头像
微客鸟窝
发布2021-10-08 15:41:13
6380
发布2021-10-08 15:41:13
举报
文章被收录于专栏:Go语言指北Go语言指北

简短变量声明 :=

答题热身

下面两个程序运行结果是?

代码语言:javascript
复制
func main() {
 i := 0
 i, j := 1, 2
 fmt.Printf("i = %d, j = %d", i, j)
}
代码语言:javascript
复制
func main() {
 i, j := 0, 0
 if true {
  j, k := 1, 1
  fmt.Printf("j = %d, k = %d\n", j, k)
 }
 fmt.Printf("i = %d, j = %d\n", i, j)
}
  1. 下面程序为什么不能通过编译
代码语言:javascript
复制
func test(i int) {
  i := 0
  fmt.Println(i)
}
答案:

i = 1, j = 2

j = 1, k = 1 i = 0, j = 0

形参已经声明了变量i,使用 := 再次声明是不允许的。

多变量赋值可能会重新声明

使用 := 一次可以声明多个变量,例如:

代码语言:javascript
复制
i, j := 0, 0
j, k := 1, 1
  • := 左侧存在新的变量时(如 k),那么已经声明的变量(如 j)会被重新声明。这并没有引入新的变量,只是把变量的值改变了。
  • := 左侧没有新变量编译报错。

不能用于函数外部

  • := 这种简短变量声明只能用于函数中,用来初始化全局变量是不行的。
  • 可以理解成 := 会拆分成两个语句,即声明和赋值。赋值语句不能出现在函数外部的。

可变参数 ...

  • 可变参数必须在函数参数列表的最后一个(否则会引起编译时歧义);
  • 可变参数在函数内部是作为切片来解析的;
  • 可变参数可以不填,不填时函数内部当成 nil 切片处理;
  • 可变参数可以填入切片;
  • 可变参数必须是相同类型的(如果需要是不同类型的可以定义为interface{}类型);

例如:

代码语言:javascript
复制
func sum(a int, vals...int) int {
    total := a
    for _, val := range vals {
        total += val
    }
    return total
}

不传值

代码语言:javascript
复制
fmt.Println(sum(1))          // "1"

传递多个参数

代码语言:javascript
复制
fmt.Println(sum(1, 2, 3, 4, 5)) // "15"

传递切片

参数部分需要使用 slice... 来表示切片,例如

代码语言:javascript
复制
values := []int{1, 2, 3, 4, 5}
fmt.Println(sum(1, values...)) // "16"

图片及部分相关技术知识点来源于网络搜索,侵权删!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-09-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 微客鸟窝 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简短变量声明 :=
    • 答题热身
      • 多变量赋值可能会重新声明
        • 不能用于函数外部
        • 可变参数 ...
          • 不传值
            • 传递多个参数
              • 传递切片
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档