目錄
引言" >引言
基本型別指標的理解" >基本型別指標的理解
引用类型指针的理解" >引用类型指针的理解
值类型和引用类型
" >值类型和引用类型
值类型" >值类型
引用型別" >引用型別
堆疊記憶體與堆疊記憶體的差異
" >堆疊記憶體與堆疊記憶體的差異
关于函数
" >关于函数
首頁 後端開發 Golang 一篇文章帶你了解Go語言基礎之指針

一篇文章帶你了解Go語言基礎之指針

Jul 24, 2023 pm 05:27 PM
go語言

引言

#因為Go語言是類別C語言,所以為了提高效率,仍然保留了指針。

但是如果沒有接觸過指針,可能學起來指針就需要多多思考一下了。

指標通常情況下,也被稱為小白勸退神奇。


基本型別指標的理解

先看這兩行程式碼。

var n1 int = 666
fmt.Println(n1)//结果:666
fmt.Printf("%p\n",n1)//结果:%!p(int=666),说明不是一个地址,就是一个值
登入後複製

記憶體分佈圖如下。

一篇文章帶你了解Go語言基礎之指針

再看看這樣兩行程式碼,這裡用到了& #。

#
var n1 int = 1
//表示取n1的地址
fmt.Println(&n1)//结果:0xc00000a0b8
fmt.Printf("%p\n",&n1)//结果:0xc00000a0b8
登入後複製

如图所示。

一篇文章帶你了解Go語言基礎之指針

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


引用类型指针的理解

先看这样的代码。

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

内存分布图如下。

一篇文章帶你了解Go語言基礎之指針


值类型和引用类型

值类型

在Go中,值类型主要有。

intfloatbool string陣列struct(結構體)

記憶體分佈大致如下。

一篇文章帶你了解Go語言基礎之指針

#:##字串#,陣列#結構體##這些屬於連續儲存變數指向的是它們的

# ###第一個位址#########,剩下的會根據長度計算。 ##########

引用型別

在Go中,引用型別主要有。

切片(slice)map管道(chan)

記憶體分佈大致如下。

一篇文章帶你了解Go語言基礎之指針


堆疊記憶體與堆疊記憶體的差異

堆疊內存在儲存上,只能存一些簡單的東西,例如數字了#,##字元了浮點數了之類的,但是堆疊記憶體分配的記憶體程式設計師不用回收,由系統自己回收,且性能很高。

堆內存在儲存上就比較豐富了,隨便存,像map,隨便塞,但是堆記憶體分配的記憶體需要程式設計師自己回收,典型例子,C ,如果語言由GC#由GC


回收,性能稍弱那麼一點點....,但是人家能隨便存啊,多隨便。

###&########################### *#########的意思###############&##########叫做取位址符。 ###############*#########叫做收地址符號吧。 ############範例######
var c *int//*int是一个整体,说明c这个变量只能接收int类型的
登入後複製

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

代码

package main


import "fmt"


func main() {
    var c *int
    var d int = 1
    //c = d//错误需要的是d的地址
    c = &d
    fmt.Println(c)
}
登入後複製

执行结果。

一篇文章帶你了解Go語言基礎之指針

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

一篇文章帶你了解Go語言基礎之指針

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

fmt.Println(*c)
登入後複製

关于函数

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

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是引用类型,所以传进去的时候就是地址,栈上面的就是地址
}
登入後複製

执行结果。

一篇文章帶你了解Go語言基礎之指針


总结

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

以上是一篇文章帶你了解Go語言基礎之指針的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Go語言中用於浮點數運算的庫有哪些? Go語言中用於浮點數運算的庫有哪些? Apr 02, 2025 pm 02:06 PM

Go語言中用於浮點數運算的庫介紹在Go語言(也稱為Golang)中,進行浮點數的加減乘除運算時,如何確保精度是�...

Go的爬蟲Colly中Queue線程的問題是什麼? Go的爬蟲Colly中Queue線程的問題是什麼? Apr 02, 2025 pm 02:09 PM

Go爬蟲Colly中的Queue線程問題探討在使用Go語言的Colly爬蟲庫時,開發者常常會遇到關於線程和請求隊列的問題。 �...

Go語言中哪些庫是由大公司開發或知名的開源項目提供的? Go語言中哪些庫是由大公司開發或知名的開源項目提供的? Apr 02, 2025 pm 04:12 PM

Go語言中哪些庫是大公司開發或知名開源項目?在使用Go語言進行編程時,開發者常常會遇到一些常見的需求,�...

Go語言中`var`和`type`關鍵字定義結構體的區別是什麼? Go語言中`var`和`type`關鍵字定義結構體的區別是什麼? Apr 02, 2025 pm 12:57 PM

Go語言中結構體定義的兩種方式:var與type關鍵字的差異Go語言在定義結構體時,經常會看到兩種不同的寫法:一�...

在Go語言中使用Redis Stream實現消息隊列時,如何解決user_id類型轉換問題? 在Go語言中使用Redis Stream實現消息隊列時,如何解決user_id類型轉換問題? Apr 02, 2025 pm 04:54 PM

Go語言中使用RedisStream實現消息隊列時類型轉換問題在使用Go語言與Redis...

在 Go 語言中,為什麼使用 Println 和 string() 函數打印字符串會出現不同的效果? 在 Go 語言中,為什麼使用 Println 和 string() 函數打印字符串會出現不同的效果? Apr 02, 2025 pm 02:03 PM

Go語言中字符串打印的區別:使用Println與string()函數的效果差異在Go...

在使用Go語言和viper庫時,為什麼傳遞指針的指針是必要的? 在使用Go語言和viper庫時,為什麼傳遞指針的指針是必要的? Apr 02, 2025 pm 04:00 PM

Go指針語法及viper庫使用中的尋址問題在使用Go語言進行編程時,理解指針的語法和使用方法至關重要,尤其是在...

為什麼Go語言中使用for range遍歷slice並存入map時,所有值會變成最後一個元素? 為什麼Go語言中使用for range遍歷slice並存入map時,所有值會變成最後一個元素? Apr 02, 2025 pm 04:09 PM

為什麼Go語言中的map迭代會導致所有值變成最後一個元素?在Go語言中,面對一些面試題時,經常會遇到關於map�...

See all articles