关于php:为什么-Go-有两种声明变量的方式有什么区别哪种好

39次阅读

共计 2089 个字符,预计需要花费 6 分钟才能阅读完成。

大家好,我是煎鱼。

有一个读者刚入门 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”?

正文完
 0