Go基础知识:指针

86 阅读3分钟

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进行初始化,然后才可以对它们进行操作。