大家好,我是煎鱼。
有一个读者刚入门 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"?