大家好,我是煎鱼。

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

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

变量申明

在 Go 中,一共有 2 种变量申明的形式,各有不同的应用场景。

别离是:

  • 规范变量申明(Variable declarations)。
  • 简短变量申明(Short variable declarations)

规范申明

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

应用语法:

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

案例代码:

var i intvar U, V, W float64var k = 0var x, y float32 = -1, -2var (    i       int    u, v, s = 1.0, 2.0, "脑子进煎鱼了")

简短申明

一个短变量申明。应用语法:

ShortVarDecl = IdentifierList ":=" ExpressionList .

案例代码:

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

网友纳闷

在咱们群里的 Go 读者提了这问题后,我也搜了搜相干材料。发现在 stackoverflow 上也有人提出了相似的纳闷:

问题是:应用哪一种申明形式,令人困惑。

题主纠结的起因在于:

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

上面咱们联合 stackoverflow 的这个发问内容和答复,进一步开展。

思考一下:规范申明和短申明,这两者的区别的在哪那里,又或是凭爱好随便应用?

区别在哪

代码块的分组申明

应用蕴含关键字 var 的申明语法时,和其余 package、import、const、type、var 等关键字一样,是能够进行分组的代码块申明的。

例如:

var (    i       int    u, v, s = 1.0, 2.0, "脑子进煎鱼了")

而短申明,是不反对的。

变量的初始值指定

应用规范的变量定义时,咱们能够只申明,不被动地定义该变量的初始值(缺省会给零值)。

例如:

var (    i    int    s    string)

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

例如:

s := "脑子进煎鱼了"

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

局部变量,辨别作用域

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

能够看看本人的代码,这种时候,咱们都会采取短申明的形式。

例如:

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

短申明在这类场景下有明确的劣势,规范的变量申明在这类场景不讨好。

从新申明变量

在 Go 语言标准中有明确提到,短变量申明是能够从新申明变量的,这是一个高频从新申明的笼罩动作。

如下:

var name = "煎鱼.txt"fi, err := os.Stat(name)if err != nil {    log.Fatal(err)}data, err := ioutil.ReadFile(name)if err != nil {    log.Fatal(err)}...

上述代码中,err 变量就是一直地被重复定义。在 if err != nil 猖獗的当初,短变量在此处的劣势,几乎是大杀器了。

总结

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

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

次要是:

  • 代码块的分组申明。
  • 变量的初始值指定。
  • 局部变量,辨别作用域。
  • 从新申明变量。

你感觉变量申明上,还有没有别的优缺点呢,欢送在评论区交换:)

若有任何疑难欢送评论区反馈和交换,最好的关系是相互成就,各位的点赞就是煎鱼创作的最大能源,感激反对。

文章继续更新,能够微信搜【脑子进煎鱼了】浏览,本文 GitHub github.com/eddycjy/blog 已收录,学习 Go 语言能够看 Go 学习地图和路线,欢送 Star 催更。

参考

  • 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"?