和 C 语言一样,按照变量的作用域,我们可以把变量划分为局部变量和全局变量
Go 语言中局部变量的概念以及全局变量的概念和C语言一模一样
局部变量:
- 定义在函数内部的变量以及函数的形参称为局部变量
- 作用域:从定义哪一行开始直到与其所在的代码块结束
- 生命周期:从程序运行到定义哪一行开始分配存储空间到程序离开该变量所在的作用域
全局变量:
- 定义在函数外面的变量称为全局变量
- 作用域范围:从定义哪行开始直到文件结尾
- 生命周期:程序一启动就会分配存储空间,直到程序结束
和C语言不同的是,C语言中可以定义相同名称的全局变量,而Go语言中无论全局变量还是局部变量,只要作用域相同都不能出现同名的变量
package main
import "fmt"
//var num1 int
//var num1 int // 报错, 重复定义
var num3 int
func main() {
//var num2
//var num2 // 报错, 重复定义
var num3 int // 不报错, 因为作用域不同
fmt.Println("num3 = ", num3)
}C 语言中全局变量没有赋值,那么默认初始值为0,局部变量没有赋值,那么默认初始值是随机值
Go 语言中无论是全局变量还是局部变量,只要定义了一个变量都有默认的 0 值
- int/int8/int16/int32/int64/uint/uint8/uint16/uint32/uint64/byte/rune/uintptr 的默认值是 0
- float32/float64 的默认值是 0.0
- bool 的默认值是 false
- string 的默认值是 ""
- pointer/function/interface/slice/channel/map/error 的默认值是 nil
- 其它复合类型 array/struct 默认值是内部数据类型的默认值
package main
import "fmt"
func main() {
var intV int // 整型变量
var floatV float32 // 实型变量
var boolV bool // 布尔型变量
var stringV string // 字符串变量
var pointerV *int // 指针变量
var funcV func(int, int)int // function变量
var interfaceV interface{} // 接口变量
var sliceV []int // 切片变量
var channelV chan int // channel变量
var mapV map[string]string // map变量
var errorV error // error变量
fmt.Println("int = ", intV) // 0
fmt.Println("float = ", floatV) // 0
fmt.Println("bool = ", boolV) // false
fmt.Println("string = ", stringV) // ""
fmt.Println("pointer = ", pointerV) // nil
fmt.Println("func = ", funcV) // nil
fmt.Println("interface = ", interfaceV) // nil
fmt.Println("slice = ", sliceV) // []
fmt.Println("slice = ", sliceV == nil) // true
fmt.Println("channel = ", channelV) // nil
fmt.Println("map = ", mapV) // map[]
fmt.Println("map = ", mapV == nil) // true
fmt.Println("error = ", errorV) // nil
var arraryV [3]int // 数组变量
type Person struct{
name string
age int
}
var structV Person // 结构体变量
fmt.Println("arrary = ", arraryV) // [0, 0, 0]
fmt.Println("struct = ", structV) // {"" 0}
}