Go语言中的指针不能进行偏移和运算,是安全指针。
指针:存储一个变量的内存地址的变量。所以指针也是一种变量,只不过它是一种特殊变量,它的值存放的是另一个变量的内存地址。
指针变量:指针变量的核心还是变量,只不是这个变量是指针类型的变量。 指针类型(*int、*int64、*string)。 var ip *int , 定义一个整形指针的变量,即ip是一个指针变量,整形指针的变量,类型为整形指针(*int)。保存一个数据在内存中的地址 ip就是一个可以执行任意int的指针, type(ip):*int
变量指针:取变量指针(地址),给指针变量赋值变量的地址(ptr := &v),指针变量等于变量的地址。
Go语言中的值类型(int、float、bool、string、array、struct)都有对应的指针类型,如:*int、*int64、*string等。
ptr := &v // v的类型为T
其中:
-
v:代表被取地址的变量,类型为
T -
ptr:用于接收地址的变量,ptr的类型就为
*T,称做T的指针类型。*代表指针。a := 10 a是整形 b := &a b是一个指针变量,b的类型为 *int, b就是指针(地址),b:0xc00001a078 type:*int
变量、指针变量、指针地址、取地址、取值的相互关系和特性如下:
-
对变量进行取地址(&)操作,可以获得这个变量的指针变量。
-
指针变量的值是指针地址。
-
对指针变量进行取值(*)操作,可以获得指针变量指向的原变量的值。
如何使用指针
指针使用流程:
-
定义指针变量。 var ip *int /* 声明指针变量 */
-
为指针变量赋值。 ip = &a /* 指针变量的存储地址 */
-
访问指针变量中指向地址的值。 *ip
new
func new(Type) *Type
其中,
- Type表示类型,new函数只接受一个参数,这个参数是一个类型。
- *Type表示类型指针,new函数返回一个指向该类型内存地址的指针。
new函数不太常用,使用new函数得到的是一个类型的指针,并且该指针对应的值为该类型的零值。
a := new(int)
fmt.Printf("%T\n", a) // *int
var a *int只是声明了一个指针变量a但是没有初始化,指针作为引用类型需要初始化后才会拥有内存空间,才可以给它赋值。应该按照如下方式使用内置的new函数对a进行初始化之后就可以正常对其赋值了:
func main() {
var a *int
a = new(int)
*a = 10
fmt.Println(*a)
}
make
make也是用于内存分配的,区别于new,**它只用于slice、map以及channel的内存创建,而且它返回的类型就是这三个类型本身,而不是他们的指针类型,因为这三种类型就是引用类型,所以就没有必要返回他们的指针了。**make函数的函数签名如下:
func make(t Type, size ...IntegerType) Type
make函数是无可替代的,我们在使用slice、map以及channel的时候,都需要使用make进行初始化,然后才可以对它们进行操作。