先来吐槽一下,Go 语言声明变量的方式太多太灵活了,以至于让人感觉到繁琐和冗余,甚至我都觉得违背了 Go 的设计哲学:“少即是多,只提供一种方法做事情”。。。

吐槽归吐槽,Go 语言变量定义的方式虽然比较多样,但是可以尝试进行简化,给它分个类。

我大致给分为两类:通过 = 定义和通过 := 定义。

= 定义

= 定义变量包括声明和赋值,需要通过关键字 var 来告诉编译器这是个变量。

变量声明,指定变量类型,并且初始化变量:

var name string = "Golang"

变量声明,指定变量类型,未初始化变量为默认值(默认值根据数据类型确定):

var name string

变量声明,指定变量类型,随后对变量进行初始化:

var name string
name = "Golang"

根据变量的值自动推导出变量的数据类型:

var name = "Golang"

多变量声明,指定变量类型,并且初始化变量:

var (
    name string = "Golang"
    num int = 1
)

多变量声明,指定变量类型,未初始化变量为默认值(默认值根据数据类型确定):

var (
    name string
    num int
)

多变量声明,先指定变量类型,随后对变量进行初始化:

var (
    name string
    num int
)
name = "Golang"
num = 1

多变量声明,根据变量的值自动推导出变量的数据类型:

var (
    name = "Golang"
    num = 1
)

多变量声明,指定变量为同一类型,未初始化变量为默认值(默认值根据数据类型确定):

var name, num int

多变量声明,指定变量为同一类型,并且初始化变量:

var name, num int = 1, 2

多变量声明,指定变量为不同类型,并且初始化变量:

var name, num = "Golang", 1

:= 定义

:= 定义变量包括声明和赋值,可以省略关键字 var 和变量类型,完全根据变量的值自动推导出变量的数据类型。

变量声明,根据变量的值自动推导出变量的数据类型,并且初始化:

name := "Golang"

多变量声明,根据变量的值自动推导出变量的数据类型,并且初始化:

name, num := "Golang", 0

简化变量声明规则:

  • 可以省略定义变量的关键字 var
  • 需要初始化变量,并且是自动推导数据类型。
  • 如果 := 左侧的变量是已经声明过的,编译会产生错误。
  • 使用 := 这种方式定义变量只能在函数内部使用。