
4.变量
变量
package main
import "fmt"
func main() {
//name变量
var name string = "zjzaki"
name = "zjzaki111111"
fmt.Println(name)
}
1.变量的定义
Go语言是静态类型语言,就是所有的类型我们都需要明确的去定义
在Go语言中, 我们声明一个变量一般是使用var关键字
var name type
- 第一个var是声明变量的关键字, 是固定的写法
- 第二个name, 就是变量的名字, 可以按照自己的需求给它定一个名字
- 第三个type, 就是用来代表变量的类型
举个例子
//定义一个字符串变量, name
var name string
//定义一个数字类型变量 age
var age int
如果你学过Java, C或者其他编程语言, 第一次看到这样的操作肯定不舒服,Go语言和许多编程语言不同, 它在声明变量是将变量的类型放在变量名称之后.这样做的好处就是可以避免像c语言中那样含糊不清的声明形式, 例如:int * a,b 其中只有a是指针而b不是.如果你想要这两个变量都是指针,则需要将它们分开书写. 而在Go中, 则可以很轻松地将它们都声明为指针类型
var a,b *int
变量的命名规则遵循驼峰命名, 首个单词小写, 每个新单词的首字母大写, 例如userFiles和systemInfo
变量定义的标准格式为
var 变量名 变量类型
变量声明以关键字var开头, 后置变量类型, 行尾无须分号.
我们有时候会批量定义变量, 如果每次都单独定义的话比较麻烦, Go语言支持批量定义变量
使用关键字var和括号,可以将一组变量定义在一起
var(
addr string
phone string
)
var形式的声明往往是用于需要显示指定变量地址的地方,或者因为变量稍后会被重新赋值而初始值无关紧要的地方.
当一个变量被声明之后, 如果没有显式的给他赋值, 系统自动赋予它该类型的零值
- 整型和浮点型变量的默认值为 0 和 0.0
- 字符串变量的默认值为空字符串
- 布尔型变量默认为false
- 切片, 函数, 指针变量的默认为nil
2.变量的初始化
变量初始化的标准格式
var 变量名 类型 = 值(表达式)
比如我想定义一些信息
var name1 string = "zjzaki"
var age1 int = 18
fmt.Printf("name:%s,age:%d",name1,name2)
这里的name和age就是变量名,name的类型为string, age的类型为int. 他们的值分别为zjzaki和18
短变量声明并初始化
name2 := "zjzaki"
age2 := 18
fmt.Printf("name:%s, age:%d",name2,age2)
这是Go语言的推导声明写法, 编译器会自动根据右值类型推断出左值对应类型
它可以自动的推导出一些类型, 但是使用也是有限制的:
- 定义变量, 同时显式初始化.
- 不能提供数据类型
- 只能用在函数内部. 不能随便到处定义
因为简洁和灵活的特点, 简短变量声明被广泛用于大部分的局部变量的声明和初始化
注意: 由于使用了:=, 而不是赋值的=, 因此推导声明写法的左值变量必须是没有定义过的变量, 若定义过,将会发生编译错误
3.理解变量(内存地址)
var num int
num = 1000
fmt.Printf("num的值: %d,内存地址: %p\n",num, &num)
num = 2000
fmt.Printf("num的值: %d,内存地址: %p\n",num,&num)
4.变量交换
package main
import "fmt"
func main() {
var a int = 100
var b int = 200
b, a = a, b
fmt.Println(a, b)
}
5.匿名变量
匿名变量的特点是一个下划线_, _本身就是一个特殊的标识符, 被称为空白标识符. 它可以像其他标识符那样用于变量的声明或赋值(任何类型都可以赋值给它), 但任何赋给这个标识符的值都将被抛弃, 因此这些值不能在后续的代码中使用, 也不可以使用这个标识符作为变量对其他变量进行赋值或运算, 使用匿名变量时, 只需要在变量声明的地方使用下划线替换即可. 例如:
package main
import "fmt"
func test() (int, int) {
return 100, 200
}
func main() {
a, _ := test()
_, b := test()
fmt.Println(a, b)
}
在编码过程中, 可能会遇到没有名称的变量, 类型或方法. 虽然这不是必须的, 但有时候这样做可以极大地增强代码的灵活性, 这些变量被统称为匿名变量.
匿名变量不占用内存空间, 不会分配内存. 匿名变量与匿名变量也不会因为多次声明而无法使用.
6.变量的作用域
一个变量(常量, 类型或函数) 在程序中都有一定的使用范围, 称之为作用域.
了解变量的作用域对我们学习Go语言来说是比较重要的, 因为Go语言会在编译时检查每个变量是否使用过, 一旦出现未使用的变量, 就会报编译错误. 如果不能理解变量的作用域, 就有可能会带来一些不明所以的编译错误.
局部变量
在函数体内声明的变量称之为局部变量, 它们的作用域只在函数体内, 函数的参数和返回值变量都属于局部变量
package main
import "fmt"
func main() {
//声明局部变量 a 和 b 并赋值
var a int = 3
var b int = 4
//声明局部变量 c 并计算 a 和 b的和
c := a + b
fmt.Printf("a = %d, b=%d, c=%d\n", a, b, c)
}
全局变量
在函数体外声明的变量称之为全局变量, 全局变量值只需要在一个源文件中定义, 就可以在所有源文件中使用, 当然, 不包含这个全局变量的源文件需要使用"import"关键字引入全局变量所在的源文件之后才能使用这个全局变量.
全局变量声明必须以var关键字开头, 如果想要在外部包中使用全局变量的首字母必须大写.