真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

go語(yǔ)言中指針傳遞與值傳遞有什么不同

指針

為蒲城等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及蒲城網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、蒲城網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!

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

類型指針,允許對(duì)這個(gè)指針類型的數(shù)據(jù)進(jìn)行修改,傳遞數(shù)據(jù)可以直接使用指針,而無(wú)須拷貝數(shù)據(jù),類型指針不能進(jìn)行偏移和運(yùn)算。

切片,由指向起始元素的原始指針、元素?cái)?shù)量和容量組成。

一個(gè)指針變量可以指向任何一個(gè)值的內(nèi)存地址,它所指向的值的內(nèi)存地址在 32 和 64 位機(jī)器上分別占用 4 或 8 個(gè)字節(jié),占用字節(jié)的大小與所指向的值的大小無(wú)關(guān)。當(dāng)一個(gè)指針被定義后沒(méi)有分配到任何變量時(shí),它的默認(rèn)值為 nil。指針變量通??s寫為 ptr。

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

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

指針傳遞與值傳遞

嚴(yán)格地說(shuō),go方法或函數(shù)只有一種傳遞方式,那就是值傳遞。每次將一個(gè)變量作為參數(shù)傳遞時(shí),都會(huì)創(chuàng)建一個(gè)新的變量副本并將其傳遞給所調(diào)用的函數(shù)或方法。副本分配在不同的內(nèi)存地址。

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

值傳遞

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)
}

運(yùn)行代碼將得到以下輸出:

{Alice Dow}

請(qǐng)注意,即使函數(shù)changeName將firstName更改為“Bob”,但更改不會(huì)影響main函數(shù)中的變量person。發(fā)生這種情況是因?yàn)楹瘮?shù)changeName修改了變量person的一個(gè)副本,而不是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)
}

運(yùn)行代碼將得到以下輸出:

{Bob Dow}

在這種情況下,函數(shù)main中的變量person在函數(shù)changeName中被修改。發(fā)生這種情況是因?yàn)椋erson和p是存儲(chǔ)在相同內(nèi)存地址的相同結(jié)構(gòu)的兩個(gè)不同指針。

變量不能被修改

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

變量是一個(gè)大的結(jié)構(gòu)

如果變量是一個(gè)大的結(jié)構(gòu),性能是一個(gè)問(wèn)題,最好是通過(guò)指針傳遞變量。這樣可以避免在內(nèi)存中復(fù)制整個(gè)結(jié)構(gòu)。

變量是一個(gè)map或slice

Go中的map和slice是引用類型,應(yīng)該通過(guò)值傳遞。

值傳遞通常開銷更小

即使Go看起來(lái)有點(diǎn)像C,它的編譯器工作方式也不同。C的類比并不總是和Go一起工作。在Go中值傳遞可能比指針傳遞開銷更小。發(fā)生這種情況是因?yàn)镚o使用逃逸分析來(lái)確定變量是否可以安全地分配到函數(shù)的棧幀上,這可能比在堆上分配變量開銷小的多。通過(guò)值傳遞可以簡(jiǎn)化Go中的逃逸分析,并為變量提供更好的分配機(jī)會(huì)。

總結(jié)

指針傳遞和值傳遞的區(qū)別

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

2、指針傳遞時(shí),調(diào)用函數(shù)中對(duì)指針?biāo)赶蚩臻g數(shù)據(jù)的修改會(huì)影響到調(diào)用者,因?yàn)樗麄冎赶虻氖峭粔K區(qū)域,指?jìng)鬟f就不會(huì)影響到調(diào)用者的數(shù)據(jù)。

以上就是golang指針傳遞和值傳遞的區(qū)別是什么?的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注創(chuàng)新互聯(lián)其它相關(guān)文章!


本文標(biāo)題:go語(yǔ)言中指針傳遞與值傳遞有什么不同
本文來(lái)源:http://weahome.cn/article/igcdgj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部