亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在Go中使用指針有什么意義?

在Go中使用指針有什么意義?

Go
慕姐4208626 2021-04-08 18:15:56
我知道Go中的指針允許函數參數的突變,但是如果它們僅采用引用(帶有適當的const或可變限定符),會不會更簡單?,F在,我們有了指針,并且對于某些內置類型(例如,映射和通道)進行隱式按引用傳遞。我是否缺少某些東西,或者Go中的指針僅僅是不必要的復雜性?
查看完整描述

3 回答

?
斯蒂芬大帝

TA貢獻1827條經驗 獲得超8個贊

指針之所以有用,有幾個原因。指針允許控制內存布局(影響CPU緩存的效率)。在Go中,我們可以定義一個結構,其中所有成員都位于連續內存中:


type Point struct {

  x, y int

}


type LineSegment struct {

  source, destination Point

}

在這種情況下,Point結構將嵌入到LineSegment結構中。但是您不能總是直接嵌入數據。如果要支持二進制樹或鏈表之類的結構,則需要支持某種指針。


type TreeNode {

  value int

  left  *TreeNode

  right *TreeNode

}

Java,Python等不存在此問題,因為它不允許您嵌入復合類型,因此無需在語法上區分嵌入和指向。


使用Go指針解決的Swift / C#結構問題

實現此目標的一種可能替代方法是像C#和Swift一樣區分struct和class。但這確實有局限性。雖然通??梢灾付ê瘮祵⒔Y構體作為inout參數來避免復制該結構體,但是它不允許您存儲對結構體的引用(指針)。這意味著當您發現一個有用的結構(例如,創建池分配器)時,就永遠不能將其視為引用類型。


自定義內存分配器

使用指針,您還可以創建自己的池分配器(這非常簡化,刪除了許多檢查以僅顯示原理):


type TreeNode {

  value int

  left  *TreeNode

  right *TreeNode


  nextFreeNode *TreeNode; // For memory allocation

}


var pool [1024]TreeNode

var firstFreeNode *TreeNode = &pool[0] 


func poolAlloc() *TreeNode {

    node := firstFreeNode

    firstFreeNode  = firstFreeNode.nextFreeNode

    return node

}


func freeNode(node *TreeNode) {

    node.nextFreeNode = firstFreeNode

    firstFreeNode = node

}

交換兩個值

指針還允許您實現swap。那就是交換兩個變量的值:


func swap(a *int, b *int) {

   temp := *a

   *a = *b

   *b = temp

}

結論

Java從未能夠完全取代C ++在諸如Google之類的地方進行系統編程,部分原因是由于缺乏控制內存布局和使用的能力而無法將性能調整到相同的程度(高速緩存未命中會嚴重影響性能)。Go旨在在許多領域取代C ++,因此需要支持指針。


查看完整回答
反對 回復 2021-04-26
?
jeck貓

TA貢獻1909條經驗 獲得超7個贊

引用不能重新分配,而指針可以。僅此一項就使指針在無法使用引用的許多情況下很有用。


查看完整回答
反對 回復 2021-04-26
  • 3 回答
  • 0 關注
  • 467 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號