第三部分:变量

这是 golang 系列教程的第三讲,在这一讲中我们将讨论 golang 中的变量。

你可以通过阅读《Golang 系列教程第二讲:Hello World》来了解 golang 的配置以及运行 hello world 程序。

什么是变量

变量是在内存中存储一定类型的值的名字。go 中有多种不同的语法来申明变量。

申明单独变量

var name type 是申明一个单独变量的语法

package main

import "fmt"

func main() {
    var age int // variable declaration
    fmt.Println("my age is", age)
}

var age int 申明了一个名为 age 的整型变量。我们并没有为它赋任何值,如果一个变量并没有赋值,go 会自动初始化一个该类型的零值给该变量。在这个例子中,age 被赋为数字 0。如果你运行上述程序,你可以看到终端会输出 “my age is 0”。

一个变量可以指定该类型的任何值。在上述程序中,age 可以被赋任何值。

package main

import "fmt"

func main() {
    var age int // variable declaration
    fmt.Println("my age is ", age)
    age = 29 //assignment
    fmt.Println("my age is", age)
    age = 54 //assignment
    fmt.Println("my new age is", age)
}

上述程序会输出

my age is 0 my age is 29 my new age is 54

带初始值申明变量

一个变量在申明的同时可以赋初值。

var name type = initialvalue 是申明变量并初始化的语法。

package main

import "fmt"

func main() {
    var age int = 29 // variable declaration with initial value

    fmt.Println("my age is", age)
}

在上面这个程序中,age 是类型为 int 的变量并含有初值 29。如果你执行上面的程序,你可以看到下面的输出,它表示变量 age 已经被初始化为 29 这个值。

my age is 29

类型推导

如果一个变量拥有初始值,那么 Go 会利用该初始值自动推断出该变量的类型。因此,如果一个变量拥有初始值,变量申明中的类型标识可以省略。

如果一个变量在申明时用的语法是 var name = initialvalue, Go 会通过该初始值自动推断出那个变量的类型。

在以下的例子中,我们可以看到变量 age 的类型申明 int 已经移除了,那是因为这个变量拥有值为 29 的初始值,go 可以推断中该变量的类型为 int

package main

import "fmt"

func main() {
    var age = 29 // type will be inferred

    fmt.Println("my age is", age)
}

多变量申明

多个变量可以在一个语句中同时申明。

var name1, name2 type = initialvalue1, initialvalue2 是多变量申明的语法。

package main

import "fmt"

func main() {
    var width, height int = 100, 50 //declaring multiple variables

    fmt.Println("width is", width, "height is", height)
}

同样,当变量拥有初始值的时候类型可以省略,下面的程序通过类型推断申明多个变量。

package main

import "fmt"

func main() {
    var width, height = 100, 50 //"int" is dropped

    fmt.Println("width is", width, "height is", height)
}

以上的程序会将 width is 100 height is 50 做为输出打印在屏幕上。

现在你大可以猜测当 width 和 height 没有初始值时,它们的初始值会被赋予 0。

package main

import "fmt"

func main() {
    var width, height int
    fmt.Println("width is", width, "height is", height)
    width = 100
    height = 50
    fmt.Println("new width is", width, "new height is ", height)
}

以上程序会打印 width is 0 height is 0 new width is 100 new height is 50

有时候我们也需要申明不同类型的变量,下面的语法可以用来申明不同类型的变量

var (
      name1 = initialvalue1
      name2 = initialvalue2
)

下面的程序使用上述的申明语法申明不同类型的变量

package main

import "fmt"

func main() {
    var (
        name   = "naveen"
        age    = 29
        height int
    )
    fmt.Println("my name is", name, ", age is", age, "and height is", height)
}

这里我们申明了字符串类型的 name,整型的 age 和 height(我们将在接下来的课程中讨论 golang 可以使用的多种变量类型),运行上面的程序会打印出 my name is naveen , age is 29 and height is 0。

短路径申明

Go 也提供另一种简洁的方式申明变量。这就是大家都熟悉的短路径申明 users := operator

package main

import "fmt"

func main() {
    name, age := "naveen", 29 //short hand declaration

    fmt.Println("my name is", name, "age is", age)
}

如果你运行上面的程序会看到输出 my name is naveen age is 29。

短路径申明需要左边的每个变量都拥有一个初始值,如果一个变量没有初始值,就会报错,下面的程序就会报错因为 age 变量没有被赋初值。

package main

import "fmt"

func main() {
    name, age := "naveen" //error

    fmt.Println("my name is", name, "age is", age)
}

另外,只要左边的其中一个变量时新变量就可以使用短路径语法进行赋值。

package main

import "fmt"

func main() {
    a, b := 20, 30 // declare variables a and b
    fmt.Println("a is", a, "b is", b)
    b, c := 40, 50 // b is already declared but c is new
    fmt.Println("b is", b, "c is", c)
    b, c = 80, 90 // assign new values to already declared variables b and c
    fmt.Println("changed b is", b, "c is", c)
}

考虑下面的程序在第8行变量 b 已经申明过了,而变量 c 却是第一次申明,因此该程序可以工作并输出 a is 20 b is 30 b is 40 c is 50 changed b is 80 c is 90

如果我们运行

package main

import "fmt"

func main() {
    a, b := 20, 30 //a and b declared
    fmt.Println("a is", a, "b is", b)
    a, b := 40, 50 //error, no new variables
}

程序将报错 “没有发现新的变量在 := 赋值语句左边”,那是因为 a 和 b 都已经被赋值过了。

变量也可以在运行时被赋值。

package main

import (
    "fmt"
    "math"
)

func main() {
    a, b := 145.8, 543.8
    c := math.Min(a, b)
    fmt.Println("minimum value is ", c)
}

上面程序中 c 的值在运行时才会被计算出,因此该程序将输出

minimum value is 145.8

既然 Go 是强制静态类型申明的语言,那么如果一个变量一开始属于某一种类型,那么它不能再被赋予其他类型。下面的程序会抛出 “cannot use “naveen” (type string) as type int in assignment” 因为 age 一开始是申明为 int 类型的,然后我们又将它指定为 string 类型。

package main

func main() {
    age := 29      // age is int
    age = "naveen" // error since we are trying to assign a string to a variable of type int
}

谢谢阅读,请你们给我反馈并在评论区域查询问题。