变量声明
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
需要注意的是,在函数内声明的变量必须被使用,否则会报错:
类型推断
变量声明时可以省略类型声明,编译器会根据值自动推断出类型,这个就叫类型推断。
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 语言中变量的声明,包括最普通的声明方式,分组声明的方式,以及同时声明多个变量的方式。
在声明局部变量时,可以通过类型推断和简写的方式,更简洁的声明一个变量。