



作为一门精巧的编程语言,Go提供了多种声明变量的方式。这样设计的目的是让每种声明风格都传达了关于变量使用方式的信息。让我们来逐一了解Go中声明变量的方法,以及每种方法适用的场景。
Go中最详细的变量声明方式使用var关键字,显式指定类型,并进行赋值。它的形式如下:
如果=右侧的类型是你期望的变量类型,你可以省略=左侧的类型声明。由于整数字面量的默认类型是int,因此以下语句会将x声明为int类型的变量:
相反,如果你想声明一个变量并将其赋予零值,你可以保留类型声明而省略=右侧的值。
Go支持使用var声明多个同类型的变量并赋值:
支持声明多个同类型的变量:
支持声明多个不同类型的变量并赋值:
还有一种使用var的方式。如果你要一次性声明多个变量,可以将它们包装在一个声明列表中:
Go语言还支持一种简短的声明和赋值格式。在函数内部,你可以使用:=运算符来替代使用类型推断的var声明。以下两种语句的作用完全相同——它们都声明x为一个值为10的int类型变量:
和var一样,你可以使用:=来同时声明多个变量。下面两行代码都将10赋值给x,将“hello”赋给y:
:=运算符有一个var关键字无法实现的特殊功能:它允许你同时为已存在的变量赋值。只要:=左侧至少有一个新变量,其他变量可以是已经存在的:
使用:=有一个限制。如果你在包(package)级别声明变量,你必须使用var,因为在函数外部的:=是不合法的。
你该选择哪种代码风格?选择一种能最清晰表达你意图的风格。在函数中,最常用的声明方式是:=。在函数外,当你需要声明多个包级变量时(这种情况较少见),可以使用声明列表。
某些情况下,在函数中你应该避免使用:=:
·当初始化变量为其零值时,使用var x int。这样可以清楚表明变量x是特意初始化为零值的。
·当将无类型常量或字面量赋值给变量时,如果常量或字面量的默认类型不是你想要的变量类型,应使用带有显式类型声明的长格式var形式。虽然使用类型转换来指定值的类型并使用:=写成x:=byte(20)是合法的,但更符合Go语言习惯的写法是var x byte=20。
·由于:=操作符允许你同时为新变量和已存在的变量赋值,有时它会在你认为在重用现有变量时创建新变量(详见4.2节)。在这些情况下,最好使用v a r显式声明所有新变量,以明确哪些变量是新创建的,然后使用赋值操作符(=)为新旧变量赋值。
尽管var和:=允许你在同一行声明多个变量,但这种样式应该只在特定情况下使用:一是当从函数返回多个值时,二是使用逗号ok模式时(详见第5章和3.4.2节)。
你应该尽量避免在函数外部(即所谓的package block作用域,详见4.1节)声明变量,要避免使用值会变化的包级变量。当你在函数外部声明变量时,会导致人们很难追踪对它的修改,这会导致程序中的数据流变得难以理解,容易引入难以发现的bug。作为一般规则,你应该只在package block作用域声明那些不会改变的变量(即常量或只读变量)。
避免在函数外部声明变量,因为它们使数据流分析变得复杂。
Go是否提供了一种确保值不可变的方法?答案是肯定的,但它与你在其他编程语言中看到的可能有些不同。现在是时候了解Go中的const关键字了。