变量和声明

未匹配的标注

变量和声明

如果我们用 x = 4 来声明和赋值变量,那么我们就可以同时开始和结束对变量的查看了。遗憾的是,Go 更为复杂些。我们将通过简单的示例来开始我们的学习。然后,在下一章中,我们会在创建和使用结构体时,进一步扩展。尽管如此,你可能还得花一段时间来适应,才能感受到它带给你的舒适感。

你可能会想:“哇!这有什么复杂的?”。 让我们开始一个例子。

下面的例子是 Go 中,声明变量和赋值最为明确的方法,但也是最为冗长的方法:

package main

import (
  "fmt"
)

func main() {
  var power int
  power = 9000
  fmt.Printf("It's over %d\n", power)
}

这里我们定义了一个 int 类型的变量 power。默认情况下,Go 会为变量分配默认值。Integers 的默认值是 0,booleans 默认值是 false,strings 默认值是 "" 等等。下面,我们创建一个值为 9000 的名为 power 的变量。我们可以将定义和赋值两行代码合并起来:

var power int = 9000

不过,这么写太长了。Go 提供了一个方便的短变量声明运算符 := ,它可以自动推断变量类型,但是这种声明运算符只能用于局部变量,不可用于全局变量:

power := 9000

这非常方便,它可以跟函数结合使用,就像这样:

func main() {
  power := getPower()
}

func getPower() int {
  return 9001
}

值得注意的是要用 := 来声明变量以及给变量赋值。相同变量不能被声明两次(在相同作用域下),如果你尝试这样,会收到错误提示。

func main() {
  power := 9000
  fmt.Printf("It's over %d\n", power)

  // 编译器错误:
  //  := 左侧不是新的变量
  power := 9001
  fmt.Printf("It's also over %d\n", power)
}

编译器会告诉你 * := 左侧不是新的变量*。这就意味着当我们首次声明一个变量时应该使用 := ,后面再给变量赋值时应该使用 =。这似乎很有道理,但是凭空来记忆且需要根据情况来切换却是很难的事。

如果你仔细阅读代码的错误信息,你会发现 variables 单词是个复数,即有多个变量,那是因为go支持多个变量同时赋值(使用 = 或者 :=):

func main() {
  name, power := "Goku", 9000
  fmt.Printf("%s's power is over %d\n", name, power)
}

另外,多个变量赋值的时候,只要其中有一个变量是新的,就可以使用:=。例如:

func main() {
  power := 1000
  fmt.Printf("default power is %d\n", power)

  name, power := "Goku", 9000
  fmt.Printf("%s's power is over %d\n", name, power)
}

尽管变量 power 使用了两次:=,但是编译器不会在第 2 次使用 :=时报错,因为这里有一个新的 name变量,它可以使用:=。然后你不能改变 power 变量的类型,它已经被声明成一个整型,所以只能赋值整数。

到目前为止,你最后需要了解的一件事是,Go 会像 import 一样,不允许你在程序中拥有未使用的变量。例如:

func main() {
  name, power := "Goku", 1000
  fmt.Printf("default power is %d\n", power)
}

这将不会通过编译,因为 name 是一个被声明但是未被使用的变量,就像 import 的包未被使用时,也将会导致编译失败,但总的来说,我认为这有助于提高代码的清洁度和可读性。

还有更多关于声明和赋值的技巧。初始化一个变量时,请使用:var NAME TYPE;给变量声明及赋值时,请使用: NAME := VALUE ; 给之前已经声明过的变量赋值时,请使用: NAME = VALUE

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://learnku.com/docs/the-little-go-b...

译文地址:https://learnku.com/docs/the-little-go-b...

上一篇 下一篇
贡献者:3
讨论数量: 0
发起讨论 查看所有版本


暂无话题~