指针
Go语言中的指针不能进行偏移和运算,是安全指针;只需要记住两个符号:&(取地址)和*(根据地址取值)。
指针地址
通过&;放在变量前进行取地址的操作,得到的就是指针地址
指针类型
通过&取到地址的变量就是指针类型,go语言中的值类型(int、float、bool、string、array、struct)都有指针类型(*int、*float等)
a := 10
b := &a
fmt.Printf("a:%d ptr:%p\n", a, &a) // a:10 ptr:0xc00001a078
fmt.Printf("b:%p type:%T\n", b, b) // b:0xc00001a078 type:*int
fmt.Println(&b) // 0xc00000e018
指针取值
对普通变量使用&操作符取地址后会获得这个变量的指针,然后可以对指针使用*操作,也就是指针取值
a := 10
b := &a
c:=*b
fmt.Println(c)//10
//示例;&与*是的一对互补的符号
func modify1(x int) {
x = 100
}
func modify2(x *int) {
*x = 100
}
func main() {
a := 10
modify1(a)
fmt.Println(a) // 10
modify2(&a)
fmt.Println(a) // 100
}
GO语言中值类型和引用类型的内存的申请(new、make)
- 值类型的内存申请:在变量声明时就自动申请了内存;也可以通过new()来申请,返回的是对应类型的指针;
- 引用类型的内存申请:引用类型在申明后并不会分配内存,需要手动申请内存;可通过make来也可以声明后直接实例化来申请内存;go中的引用类型有slice、map、channel(make只作用于这三种,且返回的是他们本生类型);此外指针本生也是引用类型
//new函数不太常用,使用new函数得到的是一个类型的指针,并且该指针对应的值为该类型的零值
a := new(int)
b := new(bool)
fmt.Printf("%T\n", a) // *int
fmt.Printf("%T\n", b) // *bool
fmt.Println(*a) // 0
fmt.Println(*b) // false
var a *int
a = new(int) //指针本生也是引用类型,不new申请的话会panic
*a = 10
fmt.Println(*a
var a int
fmt.Println(&a)//0xc00000a0c8
var b map[string]int
b=make(map[string]int,0) //make申请内存
b["zs"] = 100
fmt.Println(b) //没有make会panic
b:= map[string]int{"zs":12}
fmt.Println(b)