大家好,我是煎鱼。
有一个读者刚入门 Go,提了一个很有意思的问题:Go 有几种种申明变量的形式,作为初学者,到底用哪种,有什么区别,又为什么要有多种申明形式呢?
为此,煎鱼将和大家一起摸索这个问题。
变量申明
在 Go 中,一共有 2 种变量申明的形式,各有不同的应用场景。
别离是:
- 规范变量申明(Variable declarations)。
- 简短变量申明(Short variable declarations)
规范申明
变量申明创立了一个或多个变量,为它们绑定了相应的标识符,并给每个变量一个类型和初始值。
应用语法:
VarDecl = "var" (VarSpec | "(" { VarSpec ";"} ")" ) .
VarSpec = IdentifierList (Type [ "=" ExpressionList] | "=" ExpressionList ) .
案例代码:
var i int
var U, V, W float64
var k = 0
var x, y float32 = -1, -2
var (
i int
u, v, s = 1.0, 2.0, "脑子进煎鱼了"
)
简短申明
一个短变量申明。应用语法:
ShortVarDecl = IdentifierList ":=" ExpressionList .
案例代码:
s := "煎鱼进脑子了"
i, j := 0, 10
f := 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”?