Ein Artikel, der Ihnen hilft, die Grundlagen der Go-Sprachzeiger zu verstehen

Freigeben: 2023-07-24 17:27:01
nach vorne
1023 Leute haben es durchsucht

Einführung

Da die Go-Sprache eine C-ähnliche Sprache ist, werden Zeiger weiterhin beibehalten, um die Effizienz zu verbessern.

Aber wenn Sie noch nie mit Hinweisen in Berührung gekommen sind, müssen Sie vielleicht mehr darüber nachdenken, sie zu lernen.

Pointer wird normalerweise auch als der magische Zeiger für Anfänger bezeichnet.


Verstehen grundlegender Typzeiger

Schauen Sie sich zunächst diese beiden Codezeilen an.

var n1 int = 666
fmt.Println(n1)//结果:666
fmt.Printf("%p\n",n1)//结果:%!p(int=666),说明不是一个地址,就是一个值
Nach dem Login kopieren

Das Speicherverteilungsdiagramm sieht wie folgt aus.

Ein Artikel, der Ihnen hilft, die Grundlagen der Go-Sprachzeiger zu verstehen

Schauen Sie sich diese beiden Codezeilen noch einmal an. & wird hier verwendet.

var n1 int = 1
//表示取n1的地址
fmt.Println(&n1)//结果:0xc00000a0b8
fmt.Printf("%p\n",&n1)//结果:0xc00000a0b8
Nach dem Login kopieren

如图所示。

Ein Artikel, der Ihnen hilft, die Grundlagen der Go-Sprachzeiger zu verstehen

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


引用类型指针的理解

先看这样的代码。

var studentList = []string{"张三", "李四"}//一个切片
fmt.Println(studentList)        //结果:[张三 李四]
fmt.Printf("%p\n", studentList) //结果:0xc0000044a0
//去地址
fmt.Printf("%p\n", &studentList) //结果:0xc0000044a0
Nach dem Login kopieren

内存分布图如下。

Ein Artikel, der Ihnen hilft, die Grundlagen der Go-Sprachzeiger zu verstehen


值类型和引用类型

值类型

在Go中,值类型主要有。

intintfloatboolstring数组struct(结构体)

内存分布大致如下。

Ein Artikel, der Ihnen hilft, die Grundlagen der Go-Sprachzeiger zu verstehen

注:字符串数组结构体< code style="font-family: var(--monospace);vertical-align: initial;border-width: 1px;border-style: solid;border-color: rgb(231, 234, 237);background-color: rgb(243, 244, 244);border-radius: 3px;padding-right: 2px;padding-left: 2px;font-size: 0.9em;">floatboolstringTextstruct(结构体)


内存分布大致如下。

🎜

Ein Artikel, der Ihnen hilft, die Grundlagen der Go-Sprachzeiger zu verstehen🎜

🎜🎜注:🎜🎜🎜像🎜🎜字符串🎜🎜,🎜🎜数组🎜🎜,🎜🎜&amp;amp;amp;amp;lt;span md-inline=&amp;amp;amp;amp;quot;plain&amp;amp;amp;amp;quot;&amp;amp;amp;amp;gt;Referenztypen&amp;amp;amp;amp;lt;/span&amp;amp;amp;amp;gt;&amp;amp;amp;amp;lt;/h3&amp;amp;amp;amp;gt;&amp;amp;amp;amp;lt;p cid=&amp;amp;amp;amp;quot;n96&amp;amp;amp;amp;quot; mdtype=&amp;amp;amp;amp;quot;paragraph&amp;amp;amp;amp;quot; style=&amp;amp;amp;amp;quot;line-height: inherit;orphans: 4;margin-top: 0.8em;margin-bottom: 0.8em;white-space: pre-wrap;font-family: &amp;amp;amp;amp;quot;Open Sans&amp;amp;amp;amp;quot;, &amp;amp;amp;amp;quot;Clear Sans&amp;amp;amp;amp;quot;, &amp;amp;amp;amp;quot;Helvetica Neue&amp;amp;amp;amp;quot;, Helvetica, Arial, sans-serif;font-size: 16px;text-align: start;&amp;amp;amp;amp;quot;&amp;amp;amp;amp;gt;&amp;amp;amp;amp;lt;span md-inline=&amp;amp;amp;amp;quot;plain&amp;amp;amp;amp;quot;&amp;amp;amp;amp;gt;In Go sind dies die wichtigsten Referenztypen. &amp;amp;amp;amp;lt;/span&amp;amp;amp;amp;gt;&amp;amp;amp;amp;lt;/p&amp;amp;amp;amp;gt;&amp;amp;amp;amp;lt;p cid=&amp;amp;amp;amp;quot;n97&amp;amp;amp;amp;quot; mdtype=&amp;amp;amp;amp;quot;paragraph&amp;amp;amp;amp;quot; style=&amp;amp;amp;amp;quot;line-height: inherit;orphans: 4;margin-top: 0.8em;margin-bottom: 0.8em;white-space: pre-wrap;font-family: &amp;amp;amp;amp;quot;Open Sans&amp;amp;amp;amp;quot;, &amp;amp;amp;amp;quot;Clear Sans&amp;amp;amp;amp;quot;, &amp;amp;amp;amp;quot;Helvetica Neue&amp;amp;amp;amp;quot;, Helvetica, Arial, sans-serif;font-size: 16px;text-align: start;&amp;amp;amp;amp;quot;&amp;amp;amp;amp;gt;&amp;amp;amp;amp;lt;span md-inline=&amp;amp;amp;amp;quot;code&amp;amp;amp;amp;quot; spellcheck=&amp;amp;amp;amp;quot;false&amp;amp;amp;amp;quot;&amp;amp;amp;amp;gt;&amp;amp;amp;amp;lt;code style=&amp;amp;amp;amp;quot;font-family: var(--monospace);vertical-align: initial;border-width: 1px;border-style: solid;border-color: rgb(231, 234, 237) ;Hintergrundfarbe: rgb(243, 244, 244);Rahmenradius: 3px;Padding-rechts: 2px;Padding-links: 2px;Schriftgröße: 0,9em;&amp;amp;amp;amp;quot;&amp;amp;amp;amp;gt;Slice切片(slice)map管道(chan) ,

map,

Pipe (chan)Ein Artikel, der Ihnen hilft, die Grundlagen der Go-Sprachzeiger zu verstehen


Die Speicherverteilung ist ungefähr wie folgt.


Der Unterschied zwischen Stapelspeicher und HeapspeicherIn Bezug auf die Speicherung kann der Stapelspeicher nur einige einfache Dinge speichern, wie z Zeichen , Gleitkommazahlen usw., aber der vom Stapelspeicher zugewiesene Speicher muss nicht vom Programmierer recycelt werden, er wird vom System selbst recycelt und die Leistung ist sehr hoch .

Der Heap-Speicher ist relativ reichhaltig. Sie können ihn wie eine Karte speichern, aber der vom Heap-Speicher zugewiesene Speicher muss vom Programmierer recycelt werden. Ein typisches Beispiel ist: C++C++,如果语言由GCGC回收,性能稍弱那么一点点点....,但是人家能随便存啊,多随便。


&amp;amp;amp;amp;amp;*的意思

&amp;amp;amp;amp;amp;叫做取地址符。

*, wenn die Sprache aus GC

byGC

🎜recycling, die Leistung ist etwas schwächer... , aber die Leute können es nach Belieben speichern, wie lässig. ?? Rand oben: 1rem; Rand unten: 1 rem; Schriftstärke: fett; Zeilenhöhe: 1,225; Cursor: Text; Rand unten: 1 Pixel solides RGB (238, 238, 238); Leerraum: vor dem Umbruch ;Schriftfamilie: „Open Sans“, „Clear Sans“, „Helvetica Neue“, Helvetica, Arial, Sans-Serif;text-align: start;“>🎜&amp;amp;amp;amp;amp;🎜🎜and🎜🎜*🎜🎜meaning🎜

🎜&amp;amp;amp;amp;amp;🎜🎜 wird als Adresszeichen bezeichnet. 🎜🎜

*🎜🎜 wird als Empfangsadresszeichen bezeichnet. 🎜🎜🎜🎜Beispiel🎜🎜

var c *int//*int是一个整体,说明c这个变量只能接收int类型的
Nach dem Login kopieren

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

代码

package main


import &amp;amp;amp;amp;amp;quot;fmt&amp;amp;amp;amp;amp;quot;


func main() {
    var c *int
    var d int = 1
    //c = d//错误需要的是d的地址
    c = &amp;amp;amp;amp;amp;amp;d
    fmt.Println(c)
}
Nach dem Login kopieren

执行结果。

Ein Artikel, der Ihnen hilft, die Grundlagen der Go-Sprachzeiger zu verstehen

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

Ein Artikel, der Ihnen hilft, die Grundlagen der Go-Sprachzeiger zu verstehen

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

fmt.Println(*c)
Nach dem Login kopieren

关于函数

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

package main


import &amp;amp;amp;amp;amp;quot;fmt&amp;amp;amp;amp;amp;quot;


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

执行结果。

Ein Artikel, der Ihnen hilft, die Grundlagen der Go-Sprachzeiger zu verstehen


总结

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

Das obige ist der detaillierte Inhalt vonEin Artikel, der Ihnen hilft, die Grundlagen der Go-Sprachzeiger zu verstehen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:Go语言进阶学习
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!