重学golang,看看大佬对底层的理解,也看看有什么不明白的地方
变量的声明
1.short variable declaration
init obviously
不提供类型
仅限函数内部(退化赋值,
x := 100
println(&x)
x, y := 200, "abc" // x 退化赋值,y 是新变量。
$ go build -gcflags "-N" $ go tool objdump -S -s "main\.main" ./test
func main() {x, y := 1, 2
MOVQ $0x1, 0x10(SP) ; x
MOVQ $0x2, 0x8(SP) ; y
x, y = y+3, x+2
MOVQ 0x10(SP), AX
ADDQ $0x2, AX
MOVQ AX, 0x18(SP) ; tmp = x + 2
MOVQ 0x8(SP), AX
ADDQ $0x3, AX ; AX = y + 3
MOVQ AX, 0x10(SP) ; x = AX
MOVQ 0x18(SP), AX
MOVQ AX, 0x8(SP) ; y = tmp
*/
2.常量
常量组中的定义
const (
x uint16 = 120
y
s = "abc"
z
)
fmt.Printf("%T, %v\n", y, y) // uint16, 120
fmt.Printf("%T, %v\n", z, z) // string, abc
}
3.枚举
iota
4.别名
type X =int
注意别名与自定义类型的区别
type X int 为自定义类型
倘若使用自定义类型,不能直接比较,也不能隐式转换
type X int
~~~~~~ invalid operation: mismatched types int and X
}
# 2.2引用类型
new按类型大小分配零值内存,返回指针,只关心类型长度sizeof
make类型构造函数,完成内部初始化
- 返回类型:
new
返回指针(*T
)(类似与malloc),make
返回初始化的类型(T
)。 - 适用类型:
new
可用于任何类型,make
仅用于切片、映射和通道。 - 内存初始化:
new
分配的内存被清零,make
分配的内存被初始化为某种类型的非零值。
类型转换
(*int)(p) // --> 如果没有括号 --> *(int(p)) (<-chan int)(c) // <-(chan int(c)) (func())(x) // func() x
func()int(x) // --> 有返回值的函数类型可省略括号,但依然建议使用。 (func()int)(x)
自定义类型
//golang中类型转换必须显式进行
底层类型相同也非统一类型
除运算符外,不继承任何信息
不能隐式转换,也不能直接比较
类型断言,将具体类型的值转换为接口类型
func main() {
var a int = 100
// var b X = a
// ~ cannot use a (int) as type X
//var b X=X(a)//可以显式转换,如果底层相同的话。底层不同的话不可以转换
b := X(a)
println(b)
// println(a == b)
//
//