前言

像大多数现代编程语言一样,Go 使用变量来处理数据。因此,当您创建变量时,该变量的基础数据将保存到系统内存中。然后,您可以使用该变量来访问、更新或删除该数据。

The var statement

有多种方法可以创建变量,其中之一是使用 var 语句。

Go中的变量 - 图1

Let’s take a closer look at line 10. This var statement is made up of 2 parts:

Go中的变量 - 图2

变量声明:执行以下操作:

  1. var 隔离了一些用于存储数据的内存资源。该内存资源分配有自己唯一的内存地址。内存地址看起来有点像这样,“0xc000010200”
  2. var 对该内存资源允许存储的数据类型(又名数据类型)施加了限制。在这个例子中,我们的内存资源应该存储字符串。
  3. var 在操作系统的内部内存查找表中添加了一个条目,将变量的名称(在本例中为“greetings”)链接到其内存地址。这有点像您如何在智能手机上保存一个人的姓名及其电话号码。

Variable Initialization

赋值运算符 =为该变量分配一个初始值。该值被保存到专门的内存资源中

现在让我们看看其他几行:

第 12 行:我们使用变量的名称来访问它的值并将其打印出来。

第 13 行:我们使用反射包的 TypeOf 函数打印出变量的数据类型。

使用默认值初始化变量

您实际上可以在不初始化的情况下声明一个变量。在这种情况下,变量确实被初始化,但具有默认的零值。

类型推断

So far, we’ve seen that you need 2 lines of code to create a variable:

  1. var luckyNumber int // Declare step
  2. luckyNumber = 7 // Assignment step

但是 var 也可以执行赋值步骤:

  1. var luckyNumber int = 7

Which means you can create a variable with just a single line of code (line 9):

Go中的变量 - 图3

We can make line 9 even shorter by omitting the data type:

Go中的变量 - 图4

这仍然有效。 var 根据我们提供的数据为我们计算出变量的数据类型是什么。使用隐式类型声明变量称为类型推断。

Type Inference doesn’t always get it right, which is why on some occasions you need to explicitly specify the data type.

短赋值运算符:=

到目前为止,我们已经不再使用长格式创建变量:

  1. var luckyNumber int
  2. luckyNumber = 7

转唯了让 var 声明+赋值:

  1. var luckyNumber int = 7

…声明一个隐式类型的变量:

  1. var luckyNumber = 7

那么接下来呢?好吧,您可以通过将 var 替换为简短变量声明 := 来使这一行更短:

  1. luckyNumber := 7

:= 是在声明具有隐式类型的变量时使用 var 的替代方法。

Go中的变量 - 图5

几个重要的点:

  • 您只能在函数内部使用 := 。要在函数之外声明变量,您必须回到使用 var
  • 您只能在使用类型推断声明变量时使用 := 。如果需要显式指定数据类型,则需要返回使用 var

声明多个变量

如果您想一次性创建多个变量,则可以执行以下操作:

  1. var name string
  2. var city string
  3. var age int
  4. var married bool

您可以在一行中声明多个相同数据类型的变量。这意味着您可以将上述内容重写为:

  1. var name, city string
  2. var age int
  3. var married bool

如果您还想分配值,您可以执行以下操作:

  1. var name, city string = "David", "London"
  2. var age int = 40
  3. var married bool = true

此外,如果您对 Go 为您“猜测”数据类型(即类型推断)感到满意,那么您可以将上述内容写成一行:

  1. var name, city, age, married = "David", "London", 40, true

由于我们在推断类型,我们可以使用 := 重写上面的内容:

  1. name, city, age, married := "David", "London", 40, true

虽然这更简洁,但它确实让阅读变得有点困难。

声明多个变量(使用 var 块)

创建多个变量的另一种方法是使用 var(…) 块:

  1. var (
  2. name string
  3. city string
  4. age int
  5. married bool
  6. )

像以前一样,您可以根据数据类型对变量声明进行分组:

  1. var (
  2. name, city string
  3. age int
  4. married bool
  5. )

你可以赋值:

  1. var (
  2. name, city string = "David", "London"
  3. age int = 40
  4. married bool = true
  5. )

如果你想使用类型推断,那么你可以通过省略数据类型规范来进一步缩短它:

  1. var (
  2. name, city = "David", "London"
  3. age = 40
  4. married = true
  5. )

此外,如果使用类型推断,您可以使用 := 简写赋值运算符而不是 var(…) 块:

  1. name, city := "David", "London"
  2. age := 40
  3. married := true

变量作用域

您可以在函数内部或外部声明变量。如果在函数之外,则包中的其他函数可以访问这些变量。如果变量名以大写字母开头,则该变量是公共的,可以从包外部访问。我们将在后面的文章中详细介绍。

总结

正如你所看到的,有很多,……很多,……很多,创建变量的方法。它们都有自己的用途,创建变量的方法不一定正确或错误。我只是触及了 Go 变量的皮毛,我计划在未来写更多的文章来更详细地介绍变量。但是现在,让我们快速回顾一下迄今为止我们介绍的关键点。

这意味着 var 可以一次性完成以下操作:

  1. var 关键字用于声明+初始化变量。它还可以为变量赋值并进行类型推断以确定变量的数据类型。
  2. 速记赋值运算符( shorthand assignment operator) := 是使用 var 创建具有隐式类型的变量的替代方法。
  3. 您可以使用 var(…) 块声明多个变量。