第六章 指针


相比于C/C++,Go语言中的指针不能进行偏移和运算,是安全指针。

Go语言中的指针操作有以下两种:

  • &:取地址
  • *:根据地址取值

指针地址和指针类型

指针地址是变量在内存中的位置,在Go语言中用&变量 取变量的地址。

其基本语法如下:

ptr := &v    // v的类型为T

其中:

  • v:代表被取地址的变量,类型为T
  • ptr:用于接收地址的变量,ptr的类型就为T,称做T的指针类型。代表指针。

例如:

package mainimport "fmt"func main() { // 定义一个变量 a := 10 // 取变量的内存地址 fmt.Println(&a) // 输出:0xc000064068}

在Go语言中的值类型有:int、float、bool、string、array、struct。它们都有对应的指针类型,比如:int、float 等。

如下:

package mainimport "fmt"func main() { // 定义一个变量 a := 10 fmt.Printf("a: %T\n", &a) // *int b := "string" fmt.Printf("b: %T\n", &b) // *string c := [...]int{1, 2, 3} fmt.Printf("c: %T\n", &c) // *[3]int}

指针取值

在对普通变量使用&操作符取地址后会获得这个变量的指针,然后可以对指针使用*操作,也就是指针取值,代码如下。

func main() { //指针取值 a := 10 b := &a // 取变量a的地址,将指针保存到b中 fmt.Printf("type of b:%T\n", b) c := *b // 指针取值(根据指针去内存取值) fmt.Printf("type of c:%T\n", c) fmt.Printf("value of c:%v\n", c)}

输出如下:

type of b:*inttype of c:intvalue of c:10

总结: 取地址操作符&和取值操作符是一对互补操作符,&取出地址,根据地址取出地址指向的值。

变量、指针地址、指针变量、取地址、取值的相互关系和特性如下:

  • 对变量进行取地址(&)操作,可以获得这个变量的指针变量。
  • 指针变量的值是指针地址。
  • 对指针变量进行取值(*)操作,可以获得指针变量指向的原变量的值。

new和make


new

new是一个内置的函数,它的函数签名如下:

func new(Type) *Type

其中,

  • Type表示类型,new函数只接受一个参数,这个参数是一个类型
  • *Type表示类型指针,new函数返回一个指向该类型内存地址的指针。

new函数不太常用,使用new函数得到的是一个类型的指针,并且该指针对应的值为该类型的零值。举个例子:

func main() { 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}

**make


**

make也是用于内存分配的,区别于new,它只用于slice、map以及chan的内存创建,而且它返回的类型就是这三个类型本身,而不是他们的指针类型,因为这三种类型就是引用类型,所以就没有必要返回他们的指针了。make函数的函数签名如下:

func make(t Type, size ...IntegerType) Type

make函数是无可替代的,我们在使用slice、map以及channel的时候,都需要使用make进行初始化,然后才可以对它们进行操作。

例如:

package mainimport "fmt"func main() { // 定义一个切片 var s []int s = make([]int, 10) s[0] = 100 fmt.Println(s)}

**new和make的区别


**

  1. 二者都是用来做内存分配的。
  2. make只用于slice、map以及channel的初始化,返回的还是这三个引用类型本身;
  3. 而new用于类型的内存分配,并且内存对应的值为类型零值,返回的是指向类型的指针。


©著作权归作者所有:来自51CTO博客作者mb5ff97f7b72697的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 9.6 C++指向结构体变量的指针
  2. PHP 变量
  3. 3-7(单链表的相关算法题)
  4. 小白之路---C语言知识点
  5. 如何在 Java8 中风骚走位避开空指针异常
  6. 2021-03-06:go中,公共变量是协程安全吗?赋值操作是原子的吗?为什么?
  7. 小白之路---C语言
  8. 变量与常量
  9. volatile与synchronized的区别

随机推荐

  1. Android获得手机信息
  2. android Launcher3应用列表修改透明背景
  3. Android 开发指南文档的部分中文翻译
  4. 自定义Android应用程序标题条
  5. android基础入门GridView视图(12)
  6. Android探索与黑科技
  7. TextView 的阴影效果 及小圆点 跑马灯
  8. Android EditView 属性大全
  9. android 代码proguard
  10. Android动态加载——加载已安装APK中的类