Golang 为什么要设计两种声明变量方式呢?

437 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情

Golang 为什么要设计两种声明变量方式呢?

我们在学习 golang 的时候,一定会接触到它的声明变量的方式,你是否有对 golang 声明变量的方式感到奇怪呢?为何需要做搞两种声明变量的方式呢?在实际开发中,又应该用那种呢?

golang 声明变量的方式有两种:

  • 标准变量声明 var x float32 = -1
  • 简短变量声明 str := "I'm NutCat."

我相信不止你一人有这种困惑。这个问题很早就被人提起,比如 stackoverflow 上就有对 Go 两种声明变量的方式的疑问:

Why there are two ways of declaring variables in Go, what's the difference and which to use?

这个提问中,提问者提到了他的困惑:

  • 如果其中一种声明方式只是另一种的简写方式,为什么它们的行为会有所不同?
  • Go 的作者出于什么考虑设计了两种声明变量的方式(为什么它们不合并为一种方式)?
  • 在使用它们时,我还有什么其他方面需要注意的,以防我掉进坑里?

这些问题,在我第一次接触到 golang 变量声明的时候也同样出现过。现在,我们一起来探究一下这个问题。

变量声明

我们先看看两种声明方式的案例,更多关于声明变量的详细信息可以查看官方文档中对于变量声明的描述:Variable declarations

标准声明

var i int
var j, k, l float64
var x = 0
var y float32 = 3.14
var (
	z       int
	a, b, c = 1, 1.23, "Hello"
)

简短声明

使用 := 定义一个变量

i := 100
j, k := 3.14, 4.13
s := "I'm NutCat"

两者的区别

关键字的使用不同

  • 需要使用关键字 var
    • var count int
  • 简短变量声明则不需要使用任何关键字
    • count := 100

是否支持定义数据类型

  • 标准变量声明可以定义数据类型
  • 简短变量声明则无法定义数据类型

变量的声明和初始化方式不同

  • 标准变量声明可以分别进行变量的声明和初始化,也可以同时进行
  • 简短变量声明的声明和初始化只能同时进行

变量的可使用位置不同

  • 标准变量声明可以在函数内部和外部声明
  • 简短变量声明只能在函数内部声明

这也就说明,声明的变量的作用域不同

  • 标准变量声明声明的变量既有局部作用域也有全局作用域
  • 简短变量声明只声明的变量只有局部作用域

赋值操作不同

  • 标准变量声明在声明时为变量提供值不是强制性的,可以不赋值,声明中使用了等号运算符 =
  • 简短变量声明在声明时必须为变量提供值,声明中使用了短声明运算符 :=

代码块的分组声明

  • 标准变量声明支持以下格式的声明

    var (
    	z       int
    	a, b, c = 1, 1.23, "Hello"
    )
    
  • 标准变量声明则不支持

可重复声明

  • 标准变量声明不能重复声明同一个变量,如下会提示'i' redeclared in this package

    var i int = 100
    
    var i int = 999
    
  • 但是简短变量声明可重复声明,比如我们开发过程中常见的 err 变量声明

其中,最关键的不同点在于,标准变量声明可以在函数外声明,也可以在函数内声明,而简短变量声明只能在函数内部声明。也就是说,简短变量声明的变量只能是局部变量,它的作用域是有限的。

也就是说,设计这两种变量声明,用于区分作用域是很有帮助的。

当然,它不仅仅只是用于区分作用域,Go 如此设计的目的,是为了使语法更简洁,简短变量声明可以方便的定义局部变量。

总的来说,设计出两种方式主要是为了更加简介,两种方式的最主要的区别在于

  • 作用域不同
  • 是否可重复声明
  • 使用代码块声明
  • 初始化操作