久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      golang指針傳遞和值傳遞的區(qū)別是什么?

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

      golang指針傳遞和值傳遞的區(qū)別是什么?

      指針傳遞與值傳遞

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

      在指針傳遞變量的情況下,將創(chuàng)建指向相同內(nè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è)不同指針。

      變量不能被修改

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

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

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

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

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

      值傳遞通常開銷更小

      即使Go看起來有點(diǎn)像C,它的編譯器工作方式也不同。C的類比并不總是和Go一起工作。在Go中值傳遞可能比指針傳遞開銷更小。發(fā)生這種情況是因?yàn)镚o使用逃逸分析來確定變量是否可以安全地分配到函數(shù)的棧幀上,這可能比在堆上分配變量開銷小的多。通過值傳遞可以簡化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ù)。

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)