变量声明

Go 中使用 var 或者 const 关键字声明变量:

var <变量名> [变量类型]

变量赋值的格式是:

<变量名> = <值, 表达式, 函数等>

声明和赋值通常会合起来写:

var <变量名> [变量类型] = <值, 表达式, 函数等>

比如声明一个 string 类型的 name 变量:

var name string = "golang"

变量还可以分组声明:

var (
  i int
  j float32
)

分组声明并赋值:

var (
  age  int  = 18
  name string = "golang"
)

可以在同一行中声明多个变量和赋值:

var a, b, c int = 1, 2, 3

需要注意的是,在函数内声明的变量必须被使用,否则会报错:

Go 变量声明_Go

类型推断

变量声明时可以省略类型声明,编译器会根据值自动推断出类型,这个就叫类型推断。

package main

import (
    "fmt"
    "reflect"
)

func main() {
    var name = "golang"

    fmt.Println(reflect.TypeOf(name)) // 打印结果为 “string”
}

省略 var

在函数中声明变量时可以省略 var,但是 = 要换成 :=

name := "golang"

也就是,从最初的:

var name string = "golang"

逐步省略为:

var name = "golang"
name := "golang"

在全局中声明变量必须使用 var 声明,而不能省略。

特殊变量下划线 "_"

下划线 _ 作为变量,可以理解为一个回收站,将一个值赋值给 _ ,就相当于将此值扔进了回收站,在接下来的程序运行中这个值就不存在了。

func main() {
    var a, _, b = 10, 20, 30
    fmt.Println(a) // 10
    fmt.Println(b) // 30
}

变量的类型转换

Go 中只有显式类型转换,不存在隐式类型转换

比如,将 int 类型的变量转为 float32 类型的:

func main() {
    var a int = 1
    b := float32(a)

    fmt.Println(b) // 1
    fmt.Println(reflect.TypeOf(b)) // float32
}

反之,将一个float32 类型的变量转为 int 类型时,小数部分会被丢弃,而造成精度损失:

func main() {
    var c = 1.02
    d := int(c)

    fmt.Println(d) // 1
    fmt.Println(reflect.TypeOf(d)) // int
}

类型转换只能发生在两种兼容的类型之间,如果将一个 int 类型的数字转为 bool 类型,则会报错:

Go 变量声明_golang_02

变量的可见性规则

大写字母开头的变量是公共变量,是可导出的,也就是其他包可以读取的

小写字母开头的变量是私有变量,是不可导出的。

小结

本文介绍了 Go 语言中变量的声明,包括最普通的声明方式,分组声明的方式,以及同时声明多个变量的方式。

在声明局部变量时,可以通过类型推断和简写的方式,更简洁的声明一个变量。