Golang 变量申明方式

在这里插入图片描述

Golang 申明变量主要有三种方式:
一是使用 var 关键字,申明包级或函数级变量;
二是使用短变量申明方式,只能申明函数级变量,且需指明变量初始值;
三是使用 const 关键字,申明包级或函数级常量。

1.var

var 用于申明函数级变量和包级变量。

var name T							// 指明类型,使用类型零值
var name T = value					// 指明类型,指明初始值
var name0, name1 T					// 指明类型,使用类型零值定义多个变量
var name0, name1 T = value0, value1	// 指明类型,指明初始值定义多个变量

var name = value					// 根据值推断变量类型
var name0, name1 = value0, value1	// 根据值推断变量类型,可定义多个不同类型变量

// var name0 T, name1 T				// 错误,var 不能在同一行出现多个类型名(同一类型也不行)

// 将变量定义放在括号中
var (
	name0 = value0
	name1 = value1
)

2.短申明方式

短变量申明方式只能申明函数级变量,且需指明初始值。申明时不能指明变量类型,类型由初始化值确定。

name := value					// 申明一个变量
name0, name1 := value0, value1	// 申明多个变量,变量类型可以不同

注意:申明多个变量时,只要有一个是新的即可。

func main() {
	oldVar := 1
	oldVar, newVar := 2, 3
	fmt.Printf("oldVar=%v newVar=%v\n", oldVar, newVar) // oldVar=2 newVar=3
}

可以看出 var 与短变量申明方式的区别有如下几点:
(1)var 既可以申明函数级变量,也可以申明包级变量,而短变量申明方式只能申明函数级变量,这是二者最大的区别;
(2)var 可以不指定初始值,而短变量申明方式必须指定初始值;
(3)var 可以指定数据类型,而短变量申明方式不能指定数据类型。

3.const

const 用于申明常量,需指明初始值,一旦创建不可修改。

由于编译时的限制, 定义它们的表达式必须也是可被编译器求值的常量表达式。例如 1<<3 就是一个常量表达式,而 math.Sin(math.Pi/4) 则不是,因为对 math.Sin 的函数调用在运行时才会发生。

const name T = value					// 指明类型
const name0, name1 T = value0, value1	// 指明类型,定义多个常量
const name = value						// 无类型常量
const name0, name1 = value0, value1		// 无类型常量,可定义多个

// const name0 T, name1 T = value0, value1	// 错误,const 不能在同一行出现多个类型名(同一类型也不行)

// 将常量定义放在小括号中
const (
	name0 = value0
	name1 = value1
)

在小括号中的常量声明列表,const 常与 iota 常量生成器联用,用来申明连续的数值常量集。

// 无类型数值常量集(可转为整型或浮点型)
const (
	Sunday = iota		// 0
	Monday				// 1
	Tuesday				// 2
	Wednesday			// 3
	Thursday			// 4
	Friday				// 5
	Partyday			// 6
	numberOfDays 		// 7,该常量未导出
)

// 无类型数值常量集(可转为浮点型)
const (
	Sunday = iota + 0.1	// 0.1
	Monday				// 1.1
	Tuesday				// 2.1
	Wednesday			// 3.1
	Thursday			// 4.1
	Friday				// 5.1
	Partyday			// 6.1
	numberOfDays 		// 7.1,该常量未导出
)

关于 Go 的常量还需要知道:
(1)常量可以是类型化的或无类型化的。字面常量,true,false, iota 和某些只包含无类型化操作数的常量表达式是无类型化的;

(2)常量可由常量声明或类型转换显式地赋予其类型, 也可由变量声明或赋值以及作为表达式中的操作数隐式地赋予其类型。若常量的值不能由其类型表示就会产生一个错误。 例如,3.0 可赋予任何整数或浮点数类型的常量,而 2147483648.0 (等价于 1<<31)则只能赋予 float32, float64 或 uint32 类型的常量,而不能赋予 int32 或 string类型的常量;

(3)尽管数值常量在该语言中可拥有任意精度, 但编译器可能使用其有限精度的内部表示来实现它们。即,每个实现必须:

使用至少256位表示整数常量;
使用至少256位表示浮点常量,包括复数常量及尾数部分,和至少16位的有符号指数;
若无法精确表示一个整数常量,则给出一个错误;
若由于溢出而无法表示一个浮点或复数常量,则给出一个错误;
若由于精度限制而无法表示一个浮点或复数常量,则舍入为最近似的可表示常量。

这些要求适用于字面常量和常量表达式的求值结果。

注意,Golang 中的 const 不支持像 C/C++ 中修饰函数的参数和返回值,即下面的语句是非法的。

func test(const name *string)
func test(name *string) const *string

4.小结

三种变量申明方式有各自的使用场景,但有一点是相同的:在不同作用域申明的变量,会隐藏上一级作用域的同名变量。

var topVar = 1
func main() {
	{
		var topVar = 2
		fmt.Printf("topVar=%v\n", topVar,) // topVar=2
	}
	fmt.Println(topVar) // 1
	{
		topVar := 3
		fmt.Printf("topVar=%v\n", topVar,) // topVar=3
	}
	fmt.Println(topVar) // 1
	{
		const topVar = 4
		fmt.Printf("topVar=%v\n", topVar,) // topVar=4
	}
	fmt.Println(topVar) // 1
}

外层 topVar 的值并没有发生改变,可见大括号中的变量 topVar 是一个同名的新变量,隐藏了上一级的 topVar。


参考文献

[1] golang.org.A Tour of Go
[2] golang.org.Effective go
[3] golang.org.Language Specification
[3] Golang 25 个保留关键字

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值