ZetCode

Go 变量

最后修改于 2025 年 5 月 3 日

在本文中,我们将展示如何在 Golang 中使用变量。

Go 中的变量

Go 中的变量用于存储值并作为数据的标签。var 关键字用于显式声明变量,而 := 简写提供了一种替代方法,允许基于赋值值进行隐式类型推断。

变量可以存储不同数据类型的值。 数据类型 定义了一组可能的值以及允许在这些值上执行的操作。虽然 Go 支持显式类型声明,但它通常会从赋值的右侧自动推断数据类型,从而减少手动指定的需求。

与一旦赋值就保持不变的常量不同,变量的值会随着时间而改变。常量使用 const 关键字声明,以确保它们的值在程序执行期间保持固定。使用常量可以通过防止意外修改来提高代码的可靠性。

Go 声明变量

变量的类型跟在变量名后面。

declaring.go
package main

import "fmt"

func main() {

    var i int = 1
    var w float64 = 12.5

    fmt.Println(i, w)
}

在代码示例中,我们声明并初始化了两个变量。之后,我们打印它们。

$ go run declaring.go 
1 12.5

Go 声明多个变量

使用 var 关键字,我们可以一次声明多个变量。

multiple.go
package main

import (
    "fmt"
)

func main() {

    var i, j, k = 1, 2, 3

    var (
        name       = "John Doe"
        occupation = "gardener"
    )

    fmt.Println(i, j, k)
    fmt.Printf("%s is a %s\n", name, occupation)
}

该示例展示了如何使用 var 声明多个变量。

$ go run var_init.go 
1 2 3
John Doe is a gardener

Go 类型推断

Go 可以从赋值的右侧推断数据类型。

inference.go
package main

import (
    "fmt"
    "reflect"
)

func main() {

    var name = "John Doe"
    var age = 34

    fmt.Println(reflect.TypeOf(name))
    fmt.Println(reflect.TypeOf(age))

    fmt.Printf("%s is %d years old\n", name, age)
}

在代码示例中,我们定义了两个变量,而没有指定它们的数据类型。数据类型是从右侧推断出来的。

var name = "John Doe"
var age = 34

为了让推断正常工作,变量必须被初始化

fmt.Println(reflect.TypeOf(name))
fmt.Println(reflect.TypeOf(age))

借助 reflect 包中的 TypeOf 函数,我们打印了两个变量的数据类型。

$ go run inference.go 
string
int
John Doe is 34 years old

Go 简写变量声明

在函数内部,可以使用 := 简短赋值语句代替带有隐式类型的 var 声明。

shorthand.go
package main

import "fmt"

func main() {

    name := "John Doe"
    age := 34

    fmt.Printf("%s is %d years old\n", name, age)
}

该示例使用简写符号声明了两个变量。

Go 简写多个变量声明

我们也可以使用简写符号定义多个变量。

shorthand.go
package main

import "fmt"

func main() {

    name, age := "John Doe", 34

    fmt.Printf("%s is %d years old\n", name, age)
}

该程序在一行中使用简写符号声明了两个变量。

Go 变量默认值

没有显式初始值的变量会被赋予其零值

default.go
package main

import "fmt"

func main() {

    var age int
    var isPresent bool
    var name string
    var weight float64

    fmt.Println(age, isPresent, name, weight)
}

代码示例中的四个变量都获得了它们的默认值。

Go 变量作用域

变量的作用域是代码中可以引用该变量的区域。

scope.go
package main

import "fmt"

var word string = "falcon"

func main() {

    i := 12

    fmt.Println(word)
    fmt.Println(i)

    test()
}

func test() {

    fmt.Println(word)
}

在代码示例中,我们定义了两个变量。

var word string = "falcon"

word 变量定义在全局作用域。它在 maintest 函数中都可见。

func main() {

    i := 12
...

i 变量具有局部作用域。它仅在 main 函数内部可见。

Go 常量

与变量不同,常量不能随时间改变其值。它们使用 const 关键字定义。按照惯例,常量用大写字母书写。

constant.go
package main

import "fmt"

func main() {

    var age int = 34
    const WIDTH = 100

    age = 35
    age = 36

    // WIDTH = 101

    fmt.Println(age, WIDTH)
}

在代码示例中,我们处理了 age 变量和一个 WIDTH 常量。

来源

The Go Programming Language Specification

在本文中,我们介绍了 Golang 中的变量。

作者

我的名字是 Jan Bodnar,我是一名热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。至今,我已撰写了 1400 多篇文章和 8 本电子书。我在教授编程方面拥有十多年的经验。

列出所有 Go 教程