Go语言中的指针不能进行偏移和运算,因此被称为安全指针。
需要理解的概念:
指针地址:指针变量的值是指针地址。
指针类型:Go语言中的值类型(int、float、bool、string、array、struct)都有对应的指针类型,如:int、int64、string等。
指针取值:在对普通变量使用&操作符取地址后会获得这个变量的指针,然后可以对指针使用操作,也就是指针取值。
如下示例:
a是值为10的一个变量
a的内存地址给了b,那么b就是int类型的指针
把b这个指针的地址给了c,那么c就是指向指针b的指针
func main() {
a := 10
b := &a
c := &b
fmt.Printf("a:%d ptr:%p\n", a, &a) // a:10 ptr:0xc0000a0880
fmt.Printf("b:%p type:%T\n", b, b) // b:0xc0000a0880 type:*int
fmt.Println(&b) //0xc0000ca020
fmt.Println(*b) //10
fmt.Println(*c) //0xc0000108c0
}
复制
new与make函数
在Go语言中对于引用类型的变量,在使用的时候不仅要声明,还要为它分配内存空间,否则我们的值就没办法存储。
而对于值类型的声明不需要分配内存空间,因为它们在声明的时候已经默认分配好了内存空间。
Go语言中new和make是内建的两个函数,主要用来分配内存,这两个函数并不常用。
new与make的区别
二者都是用来做内存分配的。
make只用于slice、map以及channel的初始化,返回的还是这三个引用类型本身;
而new用于类型的内存分配,并且内存对应的值为类型零值,返回的是指向类型的指针。
new函数示例:
var a *int只是声明了一个指针变量a,没有初始化,指针作为引用类型需要初始化后才会拥有内存空间,才可以给它赋值。
如下使用内置的new函数对a进行初始化之后就可以正常对其赋值了:
func main() {
var a *int
a = new(int)
*a = 10
fmt.Println(*a)
}
复制
make函数示例:
var b map[string]int只是声明变量b是一个map类型的变量,需要使用make函数进行初始化操作之后,才能对其进行键值对赋值.
func main() {
var b map[string]int
b = make(map[string]int, 10)
b["test"] = 100
fmt.Println(b)
}
复制