任何一门语言中最基础的就是变量了,如果把内存比为一格一格整体排列的储物箱,那么变量就是每个储物箱的标识,我们通过变量来访问计算机内存。
关于定义变量的三种方式
1.
package main
import "fmt"
func main() {
var a int = 1
fmt.Println(1)
}
// 1
- 第二种
前面使用了 var 关键字,它就是用来显式定义变量的。在变量名称a 后面声明了变量的类型为整形 int,然后再给它赋上了一个初值 1。就像js啥的一样吧。上面的变量定义还可以简化,将类型去掉,因为编译器会自动推导变量类型,效果也是一样的
package main
import "fmt"
func main() {
var a = 1
fmt.Println(1)
}
// 打印出1
- 上面的变量定义还可以再一次简化,去掉 var 关键字。不过这样的话通常是写在方法内部,并不是作为全局变量啥的。赋值的等号变成了 :=,它表示变量的「自动类型推导 + 赋值」
之前我也不是很习惯第三种方法,然后其实写着写着就习惯了。
package main
import "fmt"
func main() {
a := 1
fmt.Println(a)
}
// 打印出1
- 全局变量和局部变量
go语言中的局部变量值在函数中的变量,函数调用结束它就消失了,与之对应的是全局变量,程序没有停止,就不会消失。
package main
import "fmt"
var globalValue int = 11
func main() {
var localValue int = 22
fmt.Println(globalValue, localValue)
}
同样,如果全局变量的首字母是大些的话,和方法名差不多的,大些就是公开的,小写就是私有的,只有当前包内的代码可以访问到。
- 变量与常量
Go 语言提供了常量关键字 const,用于定义常量。常量可以是全局常量也可以是局部常量。常量必须初始化,因为它无法二次赋值。全局常量的大小写规则和变量是一致的。
package main
import "fmt"
const globali int = 11
func main() {
const locali int = 12
fmt.Println(globali, locali)
}
- 指针类型
package main
import "fmt"
func main() {
var value int = 42
var pointer *int = &value
fmt.Println(pointer, *pointer)
}
// 输出 0xc4200160a0 42
指针变量本质上就是一个整型变量,里面存储的值是另一个变量内存的地址。* 和 & 符号都只是它的语法糖,是用来在形式上方便使用和理解指针的。* 操作符存在两次内存读写,第一次获取指针变量的值,也就是内存地址,然后再去拿这个内存地址所在的变量内容。
如果普通的变量是一个储物箱,那么指针变量就是另一个储物箱,这个储物箱里存放了普通变量所在储物箱的钥匙。
同时,要是交换两个变量的就方便多了。
这样
i, j = j, i
这样的话,好像不用引入第三个变量作为交换条件了。
以及对于一些不太想用到的变量可以使用匿名变量。
func GetName() (firstName, lastName, nickName string) {
return "May", "Chan", "Chibi Maruko"
}
对了,这里有个要注意的点,那就是[这个符号要跟在)后面,不能单独一行。
若只想获得nickName,则函数调用语句可以用如下方式编写:
_, _, nickName := GetName()
基础数据类型。
package main
import "fmt"
func main() {
// 有符号整数,可以表示正负
var a int8 = 1 // 1 字节
var b int16 = 2 // 2 字节
var c int32 = 3 // 4 字节
var d int64 = 4 // 8 字节
fmt.Println(a, b, c, d)
// 无符号整数,只能表示非负数
var ua uint8 = 1
var ub uint16 = 2
var uc uint32 = 3
var ud uint64 = 4
fmt.Println(ua, ub, uc, ud)
// int 类型,在32位机器上占4个字节,在64位机器上占8个字节
var e int = 5
var ue uint = 5
fmt.Println(e, ue)
// bool 类型
var f bool = true
fmt.Println(f)
// 字节类型
var j byte = 'a'
fmt.Println(j)
// 字符串类型
var g string = "abcdefg"
fmt.Println(g)
// 浮点数
var h float32 = 3.14
var i float64 = 3.141592653
fmt.Println(h, i)
}
-------------
1 2 3 4
1 2 3 4
5 5
true
abcdefg
3.14 3.141592653
97