Maison > développement back-end > Golang > Un article pour vous aider à comprendre les bases des pointeurs du langage Go

Un article pour vous aider à comprendre les bases des pointeurs du langage Go

Libérer: 2023-07-24 17:27:01
avant
1059 Les gens l'ont consulté

Introduction

Le langage Go étant un langage de type C, les pointeurs sont toujours conservés afin d'améliorer l'efficacité.

Mais si vous n'avez jamais été exposé aux pointeurs, vous devrez peut-être réfléchir davantage à leur apprentissage.

Pointer est généralement également connu sous le nom de pointeur magique du novice.


Compréhension des pointeurs de type de base

Premièrement regardez ces deux lignes de code.

var n1 int = 666
fmt.Println(n1)//结果:666
fmt.Printf("%p\n",n1)//结果:%!p(int=666),说明不是一个地址,就是一个值
Copier après la connexion

Le schéma de répartition de la mémoire est le suivant.

Un article pour vous aider à comprendre les bases des pointeurs du langage Go

Regardez à nouveau ces deux lignes de code, & est utilisé ici.

var n1 int = 1
//表示取n1的地址
fmt.Println(&n1)//结果:0xc00000a0b8
fmt.Printf("%p\n",&n1)//结果:0xc00000a0b8
Copier après la connexion

如图所示。

Un article pour vous aider à comprendre les bases des pointeurs du langage Go

如果这两个能理解,恭喜你,指针已经会了一半了。


引用类型指针的理解

先看这样的代码。

var studentList = []string{"张三", "李四"}//一个切片
fmt.Println(studentList)        //结果:[张三 李四]
fmt.Printf("%p\n", studentList) //结果:0xc0000044a0
//去地址
fmt.Printf("%p\n", &studentList) //结果:0xc0000044a0
Copier après la connexion

内存分布图如下。

Un article pour vous aider à comprendre les bases des pointeurs du langage Go


值类型和引用类型

值类型

在Go中,值类型主要有。

boolintfloatboolstring数组struct(结构体)

内存分布大致如下。

Un article pour vous aider à comprendre les bases des pointeurs du langage Go

注:字符串数组结构体string数组struct(结构体)

内存分布大致如下。

Un article pour vous aider à comprendre les bases des pointeurs du langage Go

注:

🎜字符串🎜🎜,🎜🎜数组🎜🎜,🎜🎜结构体🎜🎜这些属于🎜🎜🎜连续存储🎜🎜🎜,🎜🎜🎜变量指向🎜🎜🎜的是它们的🎜🎜🎜第一个地址🎜🎜🎜,剩下的会根据长度计算。🎜🎜🎜

Types de référence

Dans Go, les principaux types de référence sont.

slice切片(slice)map管道(chan) ,

Pipeline (chan)

La distribution de la mémoire est à peu près le suivant. La différence entre la mémoire de pile et la mémoire de tas Un article pour vous aider à comprendre les bases des pointeurs du langage Go caractères


,

nombres à virgule flottante et ainsi de suite

, mais la mémoire allouée par la mémoire de la pile n'a pas besoin d'être recyclée par le programmeur, elle est recyclée par le système lui-même et les performances sont très élevées .

La mémoire tas est relativement riche en stockage. Vous pouvez la stocker comme vous le souhaitez, comme une carte, mais la mémoire allouée par la mémoire tas doit être recyclée par le programmeur. Un exemple typique est C++C++,如果语言由GCGC回收,性能稍弱那么一点点点....,但是人家能随便存啊,多随便。


&*的意思

&叫做取地址符。

*, si le langage est constitué de GC

byGC

🎜recyclage, les performances sont un peu plus faibles... , mais les gens peuvent le sauvegarder à volonté, comme c'est décontracté. 🎜🎜🎜🎜
🎜🎜

🎜&🎜🎜et🎜🎜*🎜🎜signification🎜

&🎜🎜 est appelé le caractère d'adresse. 🎜🎜

*🎜🎜 est appelé le caractère de l'adresse de réception. 🎜🎜🎜🎜Exemple🎜🎜

var c *int//*int是一个整体,说明c这个变量只能接收int类型的
Copier après la connexion

*int是一个整体,表示c这个变量只能接收int类型地址

代码

package main


import "fmt"


func main() {
    var c *int
    var d int = 1
    //c = d//错误需要的是d的地址
    c = &d
    fmt.Println(c)
}
Copier après la connexion

执行结果。

Un article pour vous aider à comprendre les bases des pointeurs du langage Go

可以看到打印的也是一个地址,但是内存图还是基本类型图。

Un article pour vous aider à comprendre les bases des pointeurs du langage Go

如果要打印c的值,直接*c就好了,取得就是地址里面对应得值了。

fmt.Println(*c)
Copier après la connexion

关于函数

我们一直在强调,操作只会操作上面的,函数同理。

package main


import "fmt"


func say1(x int) {
    //x int 相当于隐藏了一行代码
    //隐藏的代码时 var x int = x,一定要记住这个
    fmt.Printf("say1:%p\n", x)
}
func say2(x *int) {
    //隐藏的代码是 var x *int = x,x是一个地址
    fmt.Printf("say2:%p\n", x)
}
func say3(x []int) {
    //隐藏的代码是 var x []int = x,因为x是引用类型,所以x是一个地址
    fmt.Printf("say3:%p\n", x)
}
func main() {
    say1(1)//栈上面是1,所以传进去就是1
    var x1 = 1
    say2(&x1)//say只能接收整数地址
    var x2 = []int{1, 1}
    say3(x2)//x2是引用类型,所以传进去的时候就是地址,栈上面的就是地址
}
Copier après la connexion

执行结果。

Un article pour vous aider à comprendre les bases des pointeurs du langage Go


总结

上述我们主要讲述了基本类型指针引用类型指针,也叫做值类型引用类型,并且画出了值类型引用类型内存的本质区分图,后来又讲了&*的区别,还有函数传参的本质是什么,希望对大家的学习有帮助。

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:Go语言进阶学习
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal