指针
- 1.1 指针类型、指针地址
- 1.2 指针取值(*)
- 1.3. 空指针
- 1.4. 语法糖
- 1.5. new()、make()
上一篇:数组与切片
下一篇:map 及其约束
- Go不能进行偏移或运算,是安全指针。
- 取址符(&),获取地址;取值符(*),根据地址获取值。
1.1 指针类型、指针地址
Go语言中的值类型
(int、float、string、bool、array、struct)都有对应的指针类型;如 *int、*string 等。
获取变量指针地址:&
ptr := &v
其中,v 为变量(类型T);ptr 为用于接收地址的变量(类型为*T),称作 T 的指针类型。
示例:
var a int = 10
b := &a
fmt.Printf("b:%v Type:%T, b-ptr:%d", b, b, &b)
1.2 指针取值(*)
& 取出地址,* 根据地址取出地址指向的值。
var a int = 10
b := &a
fmt.Printf("%d %T", *b, *b)
// 指针传值
f1 := func(a *int) {
*a = 100
}
f1(&a)
fmt.Println(a)
小结:
- 对变量取地址(&)操作,可以获得这个变量的指针变量。
- 指针变量的值是指针地址。
- 对指针变量进行取值(*)操作,可以获得指针变量指向的原变量的值。
1.3. 空指针
当一个指针被定义后未赋值,它的值为nil。
var s *string
// 空指针判断
if s == nil {
fmt.Println("s is nil")
}
1.4. 语法糖
使用 & 对结构体进行取址操作,相当于 new()。
type Student struct {
Name string
Age int
}
stu := &Student{}
stu.Name = "小明"
(*stu).Age = 6
fmt.Printf("%#v\n", stu)
Go语法糖:会适时地为我们进行自动地转译,在stu之上,之所以我们可以通过stu.Name = "小明"
设置名字,是因为 Go语言把它自动转译为了(*stu).Name = "小明"
。
1.5. new()、make()
- 二者都是用来做内存分配。
- new,(不常用)用于类型的内存分配,并初始化类型零值,返回的是指向类型零值的指针。
- make,只用于slice、map以及channel的初始化,返回这三个
引用类型
本身;
var s *string // 空指针nil,未分配内存(无法取值)
//fmt.Printf("%p\n", *s) // invalid memory address or nil pointer dereference
// new
s1 := new(string) // 初始化*string,值为空字符串
fmt.Printf("%v %s", s, *s1)
// makes
var m map[int]string
// m[0] = "A" // 未初始化分配内存,产生panic: assignment to entry in nil map
m = make(map[int]string, 10) // 分配内存,并定义长度
m[1] = "B"
fmt.Println(m)