91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

go語言中指針傳遞與值傳遞有什么不同

發布時間:2020-06-09 15:54:31 來源:億速云 閱讀:749 作者:元一 欄目:編程語言

指針

指針(pointer)在Go語言中可以被拆分為兩個核心概念:

類型指針,允許對這個指針類型的數據進行修改,傳遞數據可以直接使用指針,而無須拷貝數據,類型指針不能進行偏移和運算。

切片,由指向起始元素的原始指針、元素數量和容量組成。

一個指針變量可以指向任何一個值的內存地址,它所指向的值的內存地址在 32 和 64 位機器上分別占用 4 或 8 個字節,占用字節的大小與所指向的值的大小無關。當一個指針被定義后沒有分配到任何變量時,它的默認值為 nil。指針變量通常縮寫為 ptr。

每個變量在運行時都擁有一個地址,這個地址代表變量在內存中的位置。Go語言中使用在變量名前面添加&操作符(前綴)來獲取變量的內存地址(取地址操作)

Go允許通過指針(有時稱為引用)和值來傳遞參數。在這篇文章中,我們將比較兩種方法,特別注意可能影響選擇的不同情境。

指針傳遞與值傳遞

嚴格地說,go方法或函數只有一種傳遞方式,那就是值傳遞。每次將一個變量作為參數傳遞時,都會創建一個新的變量副本并將其傳遞給所調用的函數或方法。副本分配在不同的內存地址。

在指針傳遞變量的情況下,將創建指向相同內存地址的新副本。為了感受它們之間的差異,我們來看看它是如何工作的。

值傳遞

package main

import "fmt"

type Person struct {  
    firstName string
    lastName  string
}

func changeName(p Person) {  
    p.firstName = "Bob"
}

func main() {  
    person := Person {
        firstName: "Alice",
        lastName: "Dow",
    }

    changeName(person)

    fmt.Println(person)
}

運行代碼將得到以下輸出:

{Alice Dow}

請注意,即使函數changeName將firstName更改為“Bob”,但更改不會影響main函數中的變量person。發生這種情況是因為函數changeName修改了變量person的一個副本,而不是person本身。

指針傳遞

package main
import "fmt"
type Person struct {  
    firstName string
    lastName  string
}
func changeName(p *Person) {  
    p.firstName = "Bob"
}
func main() {  
    person := Person {
        firstName: "Alice",
        lastName: "Dow",
    }
    changeName(&person)
    fmt.Println(person)
}

運行代碼將得到以下輸出:

{Bob Dow}

在這種情況下,函數main中的變量person在函數changeName中被修改。發生這種情況是因為&person和p是存儲在相同內存地址的相同結構的兩個不同指針。

變量不能被修改

我們沒有其他的選擇,只能通過值傳遞。所以這個變量不能在下游修改。反之亦然,如果變量被期望修改,它必須通過指針傳遞。

變量是一個大的結構

如果變量是一個大的結構,性能是一個問題,最好是通過指針傳遞變量。這樣可以避免在內存中復制整個結構。

變量是一個map或slice

Go中的map和slice是引用類型,應該通過值傳遞。

值傳遞通常開銷更小

即使Go看起來有點像C,它的編譯器工作方式也不同。C的類比并不總是和Go一起工作。在Go中值傳遞可能比指針傳遞開銷更小。發生這種情況是因為Go使用逃逸分析來確定變量是否可以安全地分配到函數的棧幀上,這可能比在堆上分配變量開銷小的多。通過值傳遞可以簡化Go中的逃逸分析,并為變量提供更好的分配機會。

總結

指針傳遞和值傳遞的區別

1、指針傳遞傳遞的是一個地址,而非地址中的數據,傳遞數據較少,效率較值傳遞高,一般情況能用指針傳遞不用值傳遞。

2、指針傳遞時,調用函數中對指針所指向空間數據的修改會影響到調用者,因為他們指向的是同一塊區域,指傳遞就不會影響到調用者的數據。

以上就是golang指針傳遞和值傳遞的區別是什么?的詳細內容,更多請關注億速云其它相關文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

通海县| 监利县| 渝北区| 盐城市| 沙湾县| 微山县| 开阳县| 水富县| 康马县| 马关县| 腾冲县| 岳阳市| 孝昌县| 山西省| 当涂县| 临猗县| 特克斯县| 扶绥县| 乌兰察布市| 邢台县| 荔浦县| 上高县| 房山区| 五华县| 同心县| 和林格尔县| 兴文县| 青神县| 环江| 包头市| 土默特右旗| 安化县| 南溪县| 黄陵县| 桃园市| 普兰店市| 福建省| 含山县| 虹口区| 武平县| 宝坻区|