专栏首页Go语言指北Go高阶21,语法糖规则,可别掉入陷阱

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

简短变量声明 :=

答题热身

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

func main() {
 i := 0
 i, j := 1, 2
 fmt.Printf("i = %d, j = %d", i, j)
}
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. 下面程序为什么不能通过编译
func test(i int) {
  i := 0
  fmt.Println(i)
}

答案:

i = 1, j = 2

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

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

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

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

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

不能用于函数外部

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

可变参数 ...

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

例如:

func sum(a int, vals...int) int {
    total := a
    for _, val := range vals {
        total += val
    }
    return total
}

不传值

fmt.Println(sum(1))          // "1"

传递多个参数

fmt.Println(sum(1, 2, 3, 4, 5)) // "15"

传递切片

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

values := []int{1, 2, 3, 4, 5}
fmt.Println(sum(1, values...)) // "16"

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

本文分享自微信公众号 - 微客鸟窝(gophpython),作者:有码无尘

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-09-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • keras doc 4 使用陷阱与模型

    用户1908973
  • java的断言(assert)

    概述 在C和C++语言中都有assert关键,表示断言。在Java中,同样也有assert关键字,表示断言,用法和含义都差不多。在Java中,assert关键字...

    xiangzhihong
  • go 学习笔记之10 分钟简要理解 go 语言闭包技术

    闭包是主流编程语言中的一种通用技术,常常和函数式编程进行强强联合,本文主要是介绍 Go 语言中什么是闭包以及怎么理解闭包.

    雪之梦技术驿站
  • 4个费劲心思却走向编程地狱的陷阱

    4个费劲心思却走向编程地狱的陷阱 优化你的代码、创建编程抽象、编写跨平台的应用程序,几乎所有遵守这些戒律的程序员不出意外都拿着一等票去往了一个没有休憩时间,项目...

    用户1289394
  • 4个费劲心思却走向编程地狱的陷阱

    优化你的代码、创建编程抽象、编写跨平台的应用程序,几乎所有遵守这些戒律的程序员不出意外都拿着一等票去往了一个没有休憩时间,项目总能准时完成,代码库永远不会过时,...

    哲洛不闹
  • 很多小伙伴问我推荐什么书籍和网课,这次把私藏很久的资料都贡献了(上)

    平时有不少读者朋友问,有没有学习书籍网上课程推荐?今天结合自己学习经历与身边几个朋友的经历总结了一份程序员相关的书籍和网课。

    C语言与CPP编程
  • 孟岩:想抓住EOS的机会,从这四个方向入手吧!

    区块链大本营
  • 大咖周语录 | 资金不够就别“碰”能源大数据,发展大数据产业别“犯傻”

    <数据猿导读> 对于大数据的概念以及大数据在各行业的应用,每个人心中都有不同的看法。小编每周都会整理大数据牛人们的精彩观点,让你在最短的时间获得最精的思想荟萃。...

    数据猿
  • [译] 方法是否应该在 T 或 *T 上声明

    友情提示:此篇文章大约需要阅读 3分钟49秒,不足之处请多指教,感谢您的阅读。 订阅本站

    Meng小羽
  • 挑战Redis单实例内存最大极限,“遭遇”NUMA陷阱!

    我们公司的基础架构部有个云Redis平台,其中Redis实例在申请的时候可以自由选择需要的内存的大小。然后就引发了我的一个思考,Redis单实例内存最大申请到多...

    用户6543014
  • 坚持还是放弃,Go语言的“美好与丑陋”解读

    链接:https://bluxte.net/musings/2018/04/10/go-good-bad-ugly/

    23号杂货铺
  • 一个博弈游戏,据说智商130才看的懂

    博弈论是一门非常有意思的学问,之前小灰曾经分享过两个著名的博弈场景:囚徒困境和智猪博弈。

    小灰
  • 听说go语言越来越火了?那么请收下这一份go语言书单吧!

    Go 是一种简单、小巧、令人愉悦的语言。它也有一些犄角旮旯,但绝大部分是经过精心设计的。它的学习速度令人难以置信,并且规避了其他语言中一些不那么广为人知的特性。

    黄小斜学Java
  • 听说go语言越来越火了?那么请收下这一份go语言书单吧!

    Go 是一种简单、小巧、令人愉悦的语言。它也有一些犄角旮旯,但绝大部分是经过精心设计的。它的学习速度令人难以置信,并且规避了其他语言中一些不那么广为人知的特性。

    黄小斜学Java
  • Go语言核心36讲(Go语言基础知识六)--学习笔记

    在上一篇文章,我们一直都在围绕着可重名变量,也就是不同代码块中的重名变量,进行了讨论。还记得吗?

    郑子铭
  • LeetCode刷题实战7:整数反转

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就...

    程序IT圈
  • Golang之轻松化解defer的温柔陷阱

    defer是Go语言提供的一种用于注册延迟调用的机制:让函数或语句可以在当前函数执行完毕后(包括通过return正常结束或者panic导致的异常结束)执行。深受...

    梦醒人间
  • Golang之轻松化解defer的温柔陷阱

    defer是Go语言提供的一种用于注册延迟调用的机制:让函数或语句可以在当前函数执行完毕后(包括通过return正常结束或者panic导致的异常结束)执行。深受...

    老钱
  • 一篇文章洞悉ToB SaaS的增长规律

    ? 来源:ToBeSaaS 作者:戴珂 ---- ToB SaaS的本质就是增长,增长是ToB创业者始终追逐的目标。看懂SaaS增长模型和洞悉其增长规律,让增...

    腾讯SaaS加速器

扫码关注云+社区

领取腾讯云代金券