类型
变量
简短模式:
简短模式的限制 - 定义变量,同时显式初始化 - 不能提供数据类型 - 只能用在函数内部
简短模式也可以是部分退化的赋值操作,即一部分变量定义,一部分只是赋值
func main() {
x := 100
println(&x)
x,y := 200, "abc"
println(x,y)
y,z := "asd", 100
println(y,z)
}
在退化赋值中,靠左变量定义和靠右变量定义都可以.
可以看出,赋值退化的前提条件是,至少有一个新变量被定义,并且必须是同一作用域 退化赋值的常用场景是在接受错误类型时,我们可以重复使用err变量
多变量赋值
func main(){
x,y:= 1,2
x,y:= y+2, x+3
println(x,y)
}
底层过程是先算出所有右值,再进行赋值操作
#### 未使用错误 编译器将未使用的局部变量
常量
常量必须是编译期可确定的基础数字类型(字符、字符串、数字和布尔值)。 可以在函数代码块中定义常量
func main(){
const x = "abc"
println(x)
{
const x = 100
println(x)
const y = 1.1
}
}
output:
abc
100
在常量组中,如果不指定类型和初始化值,则与上一行非空常量右值相同
import "fmt"
func main() {
const (
x uint16 = 120
y
s = "abc"
z
p
)
fmt.Printf("%T, %v\n", y, y)
fmt.Printf("%T, %v\n", z, z)
fmt.Printf("%T, %v\n", p, p)
}
output:
uint16, 120
string, abc
string, abc
枚举
Go语言没有明确的emun类型,但是可以借助iota
标识符实现一组自增量来实现枚举类型。
iota
的自增作用范围为常量组,可在多常量定义中使用多个iota
。他们单独计数,只需确保组中每行常量个数相同。
import "fmt"
func main() {
const (
_, _ = iota, iota * 10
a, b
c, d
e, f = 10, iota
)
fmt.Println(a, b)
fmt.Println(c, d)
fmt.Println(e, f)
}
output
1 10
2 20
10 3
展开
常量会在编译器预处理阶段直接展开,作为指令使用。数字常量不会分配存储空间,因此无法获取地址。
基本类型
别名
byte alias for unit8
rune alias for int32
但相同底层结构一致不一定是别名。
## 引用类型
特指slice
、map
、channel
这三种预定义类型。
与基本类型相比,它们拥有更复杂的存储结构,除了分配内存以外,还需初始化指针、长度、甚至哈希分布、数据队列等。
类型转换
强制要求显式类型转换。