1. 变量
Go 语言是静态类型语言,由于编译时,编译器会检查变量的类型,所以要求所有的变量都要有明确的类型
。
变量在使用前,需要先声明。声明类型,就约定了你这个变量只能赋该类型的值。
1.1 变量声明
格式:var 变量名 类型 = 值
声明方式大概有四种,若声明时没有初始化,那么其默认值为该数据类型的 0 值,比如: string
类型就初始化为空字符串,int
类型就初始化为0,float
就初始化为 0.0,bool
类型就初始化为 false
,指针类型就初始化为 nil
:
1、一行声明一个变量,并初始化值
var name string = "变量"
2、一次声明多个变量
var (
age int
gender string
)
3、声明和初始化一个变量
使用 :=
(让编译器自动根据右侧的值推测出左侧的变量数据类型),这种方法只能用于函数内部
name := "Go 变量"
// 等同
var name string = "Go 变量"
4、声明和初始化多个变量
name, age := "rose", 18
// 可以用来做变量交换
var a int = 100
var b int = 200
b, a = a, b
1.2 全局变量和局部变量
根据变量位置可将变量划分为全局变量和全局变量,Go
变量有作用域之分,每个大括号就是一个作用域,每个作用域都可以有相应的局部变量。
全局变量
全局可使用
package main
import "fmt"
// 声明全局变量
var country = "中国"
func main() {
fmt.Println(country)
country = "China"
fmt.Println(country)
}
输出:
中国
China
注意:全局变量首字母小写,只能用于当前包中,大写可用于其他包文件,即外部可使用
局部变量
仅对应作用域可使用
package main
import "fmt"
func main() {
// 声明局部变量,在当前函数中使用
var country = "China"
fmt.Println(country)
if true {
// 声明局部变量,仅在 if 中使用
var age = 18
fmt.Println(age)
fmt.Println(country)
}
// age 不能在 if 作用域外使用
// fmt.Println(age)
}
输出:
China
18
China
country
可在当前函数作用域中使用,但 age
不能在 if
作用域外使用。
1.3 指针变量
变量分为两种:
- 普通变量:存储的为数据本身
- 指针变量:存储的为数据/内存地址
指针变量声明可以使用 new
函数,也可以使用 &普通变量
:
package main
import "fmt"
func main() {
// 指针变量,方法一
var name string = "rose"
var ptr = &name // & 后面接变量名,表示取出该变量的内存地址
fmt.Println(name) // rose
fmt.Println(ptr) // 0xc00005e270
// 指针变量,方法二 new 函数
ptr2 := new(int)
fmt.Println(ptr2) // 0xc0000a6090
fmt.Println(*ptr2) // * 指针变量名,表示从内存中取出值、0
}
使用表达式 new(Type)
将创建一个Type
类型的匿名变量,初始化为Type
类型的零值,然后返回变量地址,返回的指针类型为*Type
。
1.4 匿名变量
常量和变量都只能声明一次,声明多次就会编译报错,匿名变量除外,它有如下优点:
- 不分配内存,不占用内存空间
- 不需要你为命名无用的变量名而纠结
- 多次声明不会有任何问题
一般可以用来接收必须接收,但又用不到的值:
func GetData() (int, int) {
return 100, 200
}
func main(){
a, _ := GetData()
_, b := GetData()
fmt.Println(a, b)
}