社区编辑申请
注册/登录
为什么 Go 有两种声明变量的方式,有什么区别,哪种好?
开发 后端
有一位读者刚入门 Go ,提了一个很有意思的问题:Go 有几种声明变量的方式,作为初学者,到底用哪种,有什么区别,又为什么要有多种声明方式呢?

本文转载自微信公众号「脑子进煎鱼了」,作者陈煎鱼 。转载本文请联系脑子进煎鱼了公众号。

大家好,我是煎鱼。

有一位读者刚入门 Go ,提了一个很有意思的问题:Go 有几种声明变量的方式,作为初学者,到底用哪种,有什么区别,又为什么要有多种声明方式呢?

为此,煎鱼将和大家一起探索这个问题。

变量声明

在 Go 中,一共有 2 种变量声明的方式,各有不同的使用场景。

分别是:

  • 标准变量声明(Variable declarations)。
  • 简短变量声明(Short variable declarations)

标准声明

变量声明创建了一个或多个变量,为它们绑定了相应的标识符,并给每个变量一个类型和初始值。

使用语法:

  1. VarDecl     = "var" ( VarSpec | "(" { VarSpec ";" } ")" ) . 
  2. VarSpec     = IdentifierList ( Type [ "=" ExpressionList ] | "=" ExpressionList ) . 

案例代码:

  1. var i int 
  2. var U, V, W float64 
  3. var k = 0 
  4. var x, y float32 = -1, -2 
  5. var ( 
  6.  i       int 
  7.  u, v, s = 1.0, 2.0, "脑子进煎鱼了" 

简短声明

一个短变量声明。使用语法:

  1. ShortVarDecl = IdentifierList ":=" ExpressionList . 

案例代码:

  1. s := "煎鱼进脑子了" 
  2. i, j := 0, 10 
  3. f := func() int { return 7 } 
  4. ch := make(chan int
  5. r, w, _ := os.Pipe() 
  6. _, y, _ := coord(p)  

网友疑惑

在我们群里的 Go 读者提了这问题后,我也搜了搜相关资料。发现在 stackoverflow 上也有人提出了类似的疑惑:

问题是:使用哪一种声明方式,令人困惑。

题主纠结的原因在于:

  • 如果一个只是另一个的速记方式,为什么它们的行为会不同?
  • Go 的作者出于什么考虑,让两种方式来声明一个变量(为什么不把它们合并成一种方式)?只是为了迷惑我们?
  • 有没有其他方面需要我在使用时留心的,以防掉进坑里?

下面我们结合 stackoverflow 的这个提问内容和回答,进一步展开,带大家看看里面到底卖的是什么 “药”。

先思考一下:标准声明和短声明,这两者的区别的在哪那里,又或是凭喜好随意使用?

区别在哪

代码块的分组声明

使用包含关键字 var 的声明语法时,和其他 package、import、const、type、var 等关键字一样,是可以进行分组的代码块声明的。

例如:

  1. var ( 
  2.  i       int 
  3.  u, v, s = 1.0, 2.0, "脑子进煎鱼了" 

而短声明,是不支持的。

变量的初始值指定

使用标准的变量定义时,我们可以只声明,不主动地定义该变量的初始值(缺省会给零值)。

例如:

  1. var ( 
  2.  i    int 
  3.  s    string 

而短声明则不行,必须要在程序中主动地去对变量定义一个值。

例如:

s := "脑子进煎鱼了"

此处即使是定义的空字符串,那也属于是用户侧主动定义的,而非缺省的零值。

局部变量,区分作用域

在编写程序时,我们经常会有一些局部变量声明,且作用域是有限的。

可以看看自己的代码,这种时候,我们都会采取短声明的方式。

例如:

  1. for idx, value := range array { 
  2.     // Do something with index and value 
  3.  
  4. if num := runtime.NumCPU(); num > 1 { 
  5.     fmt.Println("Multicore CPU, cores:", num) 

短声明在这类场景下有明确的优势,标准的变量声明在这类场景不讨好。

重新声明变量

在 Go 语言规范中有明确提到,短变量声明是可以重新声明变量的,这是一个高频重新声明的覆盖动作。

如下:

  1. var name = "煎鱼.txt" 
  2.  
  3. fi, err := os.Stat(name
  4. if err != nil { 
  5.     log.Fatal(err) 
  6.  
  7. data, err := ioutil.ReadFile(name
  8. if err != nil { 
  9.     log.Fatal(err) 
  10. ... 

上述代码中,err 变量就是不断地被反复定义。在 if err != nil 猖狂的现在,短变量在此处的优势,简直是大杀器了。

总结

相信很多小伙伴初入门时都为此纠结过一下,又或是很多教程压根就没有说清楚两者变量声明的区别。

在今天这篇文章中,我们介绍了 Go 的两种变量声明放水。并且针对短声明存在的场景进行了说明。

主要是:

  • 代码块的分组声明。
  • 变量的初始值指定。
  • 局部变量,区分作用域。
  • 重新声明变量。

你觉得变量声明上,还有没有别的优缺点呢,欢迎在评论区交流:)

参考

GoLang Variable Declaration

Why there are two ways of declaring variables in Go, what's the difference and which to use?

 

What is the best practice when declaring variables in go (golang)? E.G. should I use "var x int = 1" or just "x := 1"?

 

责任编辑:武晓燕 来源: 脑子进煎鱼了
相关推荐

2022-04-11 11:38:44

Python代码游戏

2022-05-18 23:42:08

网络安全安全分析工具

2022-05-09 07:08:14

LinuxBashShell

2022-04-10 23:02:08

GoRust语言

2022-04-12 11:38:06

C语言全局变量

2022-05-17 16:56:33

开发工具前端

2022-04-12 09:48:22

云计算安全云服务云安全

2022-04-13 08:20:32

DockerGo项目

2022-05-16 10:49:28

网络协议数据

2022-04-13 09:57:24

Go语言C语言程序开发

2022-04-26 08:00:00

存储UFSeMMC

2022-05-07 10:20:17

truncatedeleteMySQL

2022-05-13 09:15:21

三层交换机二层交换机VLAN

2022-05-17 15:51:32

数据中心运维能力基础设施

2022-05-20 14:08:13

Web3元宇宙区块链

2022-05-06 09:21:21

TypeScriptinterfacetype

2022-04-15 10:11:03

机器学习scikit-lea

2022-05-11 14:05:11

区块链网络安全存储

2022-05-14 16:08:25

边缘计算AI人工智能

2022-04-18 09:41:14

Go架构设计

同话题下的热门内容

Python 字符串总结,建议收藏!这份Java日志格式规范,拿走不谢!Mybatis-Plus官方发布分库分表神器,一个依赖轻松搞定!后端思维篇:如何应用设计模式优化代码改变 Python 对象规则的黑魔法 Metaclass几种限流算法的Go语言实现JMeter关联之正则表达式提取器在 Go 中实现一个支持并发的 TCP 服务端

编辑推荐

使用Kotlin做开发一个月后的感想面试官问你什么是消息队列?把这篇甩给他!五大自动化测试的Python框架图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS)2018年最流行的十大编程语言,其中包括你用的语言吗?
我收藏的内容
点赞
收藏

51CTO技术栈公众号