这是第二部分学习笔记
关于指针
go中的指针相比c中简单不少,他没有指针的运算,所以比较安全;用的最多的是作为引用来使用。
1. 指针关键点
其实关键的几个点记住就行了。
a := 10
ptr := &a // 取变量a的地址
b := *ptr // 指针的变量值
*ptr = 20 // 改变指针变量的值
var p *int // int型指针
c := 30
p = &c
// 测试
fmt.Printf("%p\n", p)
// 0xc0000a6018
fmt.Println(a, b, c)
//20 10 30
2. 对于引用类型,申明后不会分配内存没法直接使用
这点非常值得注意,也很容易出错。
错误示范
var p *int // 这里是一个空指针<nil>
*p = 20 // 直接指针变量赋值 不行
报错如下:
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x1057602]
3. new 和 make的作用在于会分配内存
- new的语法,它用的不多
new(T) *T // 返回一个指针类型
- make主要用于 map、slice、chan (返回的是类型-非指针),因为这些类型都是引用,相当于这些类型分配内存的快捷方式
a := new(int)
*a = 20
fmt.Printf("a地址:%p; a变量%v", a, *a)
//a地址:0xc0000a6018; a变量20%
4. 空指针
var a *int
if a == nil {
fmt.Println("a是空指针")
} else {
fmt.Println("a是非空指针")
}
网友评论