变量
通过类型转换或指针操作,我们可用不同方式修改变量值,但这并不意味着改变了变量类型
定义
var x int //自动初始化为0
var y = false // 自动推断为bool类型
var x, y int //相同类型的多个变量
var a, b = 100, "abc" //不同类型的初始化值
// 建议以组方式整理多行变量定义
var (
x, y int
a, b = 100, "abc"
)
简短模式
除var关键字外,可以用更简短的变量和初始化语法
func main() {
x := 100
a, b := 100, "abc"
}
简短模式下有限制:
- 定义变量,同时显示初始化
- 不能提供数据类型
- 只能用在函数内部
注意:用简短模式,可能会造成一些意外错误,原本打算修改全局变量,结果变成重新定义同名局部变量。
package main
import "fmt"
var x = 100
func main() {
fmt.Println(&x, x)
x := "abc"
fmt.Println(&x, x)
}
输出: 根据内存地址,可以判断出是两个不同变量
0x3a2250 100
0xc00002e1f0 abc
简短定义在函数多返回值,以及if/for/switch 等语句定义局部变量非常方便
多变量赋值
多变量赋值操作时,首先计算所有右值,再一次完成赋值操作
func main() {
x, y := 1, 2
x, y = y+3, x+2
fmt.Println(x, y)
}
输出:
5 3
注:赋值操作,必须确保左右值类型相同
未使用错误
带着一点php经验在去学习go,真心有点不习惯,不过没办法,还得改,希望后面两者别搞混了。
在go里面编译器会将未使用的局部变量当做错误抛出
func main() {
x := 100
}
输出:
.2.1var.go:47:2: x declared but not used
内建变量类型
类型
- bool, string
- (u)int, (u)int8, (u)int8, (u)int16, (u)int32, (u)int64, unitprt(指针)
- byte, rune(go语言内字符型,等同于char,长度32位)
- float32, float64, complex64(复数 实部,虚补 各32位), complex128 (复数 实部,虚补 各64位)
强制类型转换
- 类型转换是强制的
变量定义要点
- 变量类型写在变量名之后
- 编译器可推测变量类型
- 没有char类型 ,只有rune
- 支持复数类型