携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天,点击查看活动详情
变量声明
变量来源于数学,是计算机语言中能储存计算结果或能表示值抽象概念。变量可以通过变量名访问。
Go 语言变量名由字母、数字、下划线组成,其中首个字符不能为数字。声明变量的一般形式是使用 var 关键字:
var identifier type
可以一次声明多个变量:
var identifier1, identifier2 type
示例:
package main
import "fmt"
func main() {
var a string = "James"
fmt.Println(a)
var b, c int = 1, 2
fmt.Println(b, c)
}
如果声明了变量,并且指定变量类型,但是没有初始化,则变量默认为零值。零值就是变量没有做初始化时系统默认设置的值。
-
数值类型(包括complex64/128)为 0
-
布尔类型为 false
-
字符串为 "" (空字符串)
-
以下几种类型为 nil:
var a *int var a []int var a map[string] int var a chan int var a func(string) int var a error // error 是接口
示例:
package main
import "fmt"
func main() {
var i int
var f float64
var b bool
var s string
fmt.Printf("%v %v %v %q\n", i, f, b, s)
var a *int
fmt.Println(a)
}
变量声明也可以不指定变量类型,编译器根据变量的值自行判定变量类型:
package main
import "fmt"
func main() {
var b = true // bool
fmt.Println(b)
var str = "I am string" // string
fmt.Println(str)
var i = 1024 // int
fmt.Println(i)
}
简短格式声明
除 var 关键字外,还有一种声明变量的方式就是使用:=
,与正常的声明不一样的是 :=
是声明变量并赋值。
// = 使用必须使用先var声明例如:
var a
a = 100
//或
var b = 100
//或
var c int = 100
// := 是声明并赋值,并且系统自动推断类型,不需要var关键字
d := 100
:=
是用于未被定义过的变量,编译器自动进行右值推导定义并赋值,如果已经定义则编译报错
package main
import "fmt"
func main() {
var i = 1
i := 2 // error
fmt.Println(i)
}
但使用“:=
”为多个变量赋值时,如果引入了至少一个新的变量,编译是可以通过的,如下例所示:
package main
import "fmt"
func main() {
var i = 1
i, err := 2, false
fmt.Println(i, err)
}
需要注意的是,简短模式(short variable declaration)有以下限制:
- 定义变量,同时显式初始化。
- 不能提供数据类型。
- 只能用在函数内部。
因为简洁和灵活的特点,简短变量声明被广泛用于大部分的局部变量的声明和初始化。var 形式的声明语句往往是用于需要显式指定变量类型地方,或者因为变量稍后会被重新赋值而初始值无关紧要的地方。
多变量声明
//类型相同多个变量, 非全局变量
var vname1, vname2, vname3 type
vname1, vname2, vname3 = v1, v2, v3
// 和 python 很像,不需要显示声明类型,自动推断
var vname1, vname2, vname3 = v1, v2, v3
// 出现在 := 左侧的变量不应该是已经被声明过的,否则会导致编译错误
vname1, vname2, vname3 := v1, v2, v3
// 这种因式分解关键字的写法一般用于声明全局变量
var (
vname1 v_type1
vname2 v_type2
)
示例:
package main
var x, y int
var ( // 这种因式分解关键字的写法一般用于声明全局变量
a int
b bool
)
var c, d int = 1, 2
var e, f = 123, "hello"
//这种不带声明格式的只能在函数体中出现
//g, h := 123, "hello"
func main() {
g, h := 123, "hello"
println(x, y, a, b, c, d, e, f, g, h)
}
匿名变量
在编码过程中,可能会遇到没有名称的变量、类型或方法。虽然这不是必须的,但有时候这样做可以极大地增强代码的灵活性,这些变量被统称为匿名变量。
匿名变量的特点是一个下画线“ ”,“ ”本身就是一个特殊的标识符,被称为空白标识符。它可以像其他标识符那样用于变量的声明或赋值(任何类型都可以赋值给它),但任何赋给这个标识符的值都将被抛弃,因此这些值不能在后续的代码中使用,也不可以使用这个标识符作为变量对其它变量进行赋值或运算。使用匿名变量时,只需要在变量声明的地方使用下画线替换即可。例如:
package main
import "fmt"
func GetData() (int, int) {
return 100, 200
}
func main() {
a, _ := GetData()
_, b := GetData()
fmt.Println(a, b)
}
匿名变量不占用内存空间,不会分配内存。匿名变量与匿名变量之间也不会因为多次声明而无法使用。
常量
Go语言中的常量使用关键字 const 定义,用于存储不会改变的数据,常量是在编译时被创建的,即使定义在函数内部也是如此,并且只能是布尔型、数字型(整数型、浮点型和复数)和字符串型。由于编译时的限制,定义常量的表达式必须为能被编译器求值的常量表达式。
const pi = 3.14159 // 省略类型说明符,编译器可以根据变量的值来推断其类型
//显式类型定义:
const a string = "abc"
//隐式类型定义:
const b = "abc"
// 和变量声明一样,可以批量声明多个常量:
const (
e = 2.7182818
pi = 3.1415926
)