首頁  >  文章  >  後端開發  >  一篇文章帶你了解Go語言基礎之指針

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

Go语言进阶学习
Go语言进阶学习轉載
2023-07-24 17:27:01965瀏覽

引言

#因為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中文網其他相關文章!

陳述:
本文轉載於:Go语言进阶学习。如有侵權,請聯絡admin@php.cn刪除