最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go 語(yǔ)言中的值類型和指針類型區(qū)別對(duì)比分析

 更新時(shí)間:2025年11月21日 09:34:13   作者:半桶水專家  
在Go語(yǔ)言中,值類型(如int、struct)存儲(chǔ)實(shí)際數(shù)據(jù),而指針類型(如*int、*struct)存儲(chǔ)數(shù)據(jù)的內(nèi)存地址,值類型是按值傳遞的,修改不會(huì)影響原變量,本文給大家介紹Go 語(yǔ)言中的值類型和指針類型,感興趣的朋友跟隨小編一起看看吧

在 Go 語(yǔ)言中,變量的類型可以是值類型(Value Type)或指針類型(Pointer Type)。它們的核心區(qū)別在于:存儲(chǔ)的內(nèi)容不同、內(nèi)存地址的變化不同、函數(shù)傳參的行為不同。

下面我從本質(zhì) + 內(nèi)存模型 + 例子 + 什么時(shí)候用指針 來完整解釋。

? 一、值類型 vs 指針類型 — 本質(zhì)區(qū)別

特性值類型指針類型
存儲(chǔ)內(nèi)容實(shí)際數(shù)據(jù)數(shù)據(jù)的內(nèi)存地址(指向某個(gè)值)
賦值時(shí)拷貝整份數(shù)據(jù)拷貝地址(兩個(gè)指針指向同一塊內(nèi)存)
改動(dòng)是否影響原變量? 不影響? 會(huì)影響
空值無法為 nil可以為 nil
內(nèi)存分配棧為主指向堆或棧都可能

? 二、本質(zhì)理解:變量保存的是什么?

? 值類型(int、float、struct、array 等)

變量里保存的是“真實(shí)的數(shù)據(jù)”。

a := 10
b := a   // b 拷貝一份 10
b = 20
fmt.Println(a) // 10 (不會(huì)受到影響)

值類型總是復(fù)制一份獨(dú)立的數(shù)據(jù)。

? 指針類型(*int、*struct、*MyType)

變量里保存的是“另一個(gè)變量的地址”。

a := 10
b := &a   // b 保存 a 的地址
*b = 20
fmt.Println(a) // 20 (a 被修改)

指針類型意味著多個(gè)變量指向同一塊內(nèi)存,因此修改一個(gè)會(huì)影響另一個(gè)。

? 三、內(nèi)存示意圖(最直觀)

? 值類型

a (10)
b (10)  ← 拷貝出的新數(shù)據(jù)

? 指針類型

a (10)
b (&a) → 指向 a 的內(nèi)存地址

? 四、函數(shù)傳參時(shí)的區(qū)別(非常重要)

值類型:傳值,拷貝一份

func add(x int) {
    x++
}
a := 10
add(a)
fmt.Println(a) // 10(沒有改變)

指針類型:傳地址,修改原變量

func add(x *int) {
    (*x)++
}
a := 10
add(&a)
fmt.Println(a) // 11(被改變了)

? 五、結(jié)構(gòu)體特別重要:值類型默認(rèn)復(fù)制!

type User struct {
    Name string
}
func change(u User) {
    u.Name = "Tom"
}
func main() {
    user := User{Name: "Sam"}
    change(user)
    fmt.Println(user.Name) // Sam(沒變)
}

改用指針就會(huì)改變?cè)瓟?shù)據(jù):

func change(u *User) {
    u.Name = "Tom"
}
change(&user)
fmt.Println(user.Name)  // Tom

? 六、什么時(shí)候應(yīng)該使用指針?

? 1. 需要修改函數(shù)外的變量

修改狀態(tài)、計(jì)數(shù)器、累加器等。

? 2. struct 較大,避免復(fù)制(性能)

Go 的結(jié)構(gòu)體可能很大,復(fù)制成本高:

func process(u *LargeStruct) { ... }

? 3. 實(shí)現(xiàn)方法的“接收者”為指針(避免復(fù)制)

很多類型的方法必須用指針接收器:

func (u *User) SetName(name string) {
    u.Name = name
}

? 4. 需要表示 nil(值不存在)

var p *User = nil

值類型永遠(yuǎn)不能為 nil。

? 七、一句話總結(jié)

  • 值類型保存真實(shí)值,賦值會(huì)復(fù)制,不會(huì)影響彼此。
  • 指針類型保存地址,賦值只復(fù)制地址,多個(gè)變量共享底層數(shù)據(jù)。
  • 指針多用于需要改變?cè)瓟?shù)據(jù)、避免拷貝大結(jié)構(gòu)體、或表示 nil 的場(chǎng)景。

到此這篇關(guān)于Go 語(yǔ)言中的值類型和指針類型的文章就介紹到這了,更多相關(guān)go語(yǔ)言值類型和指針類型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Golang中Channel的原理和使用技巧

    詳解Golang中Channel的原理和使用技巧

    Channel管道提供了一種機(jī)制,它在兩個(gè)并發(fā)執(zhí)行的協(xié)程之間進(jìn)行同步,并通過傳遞與該管道元素類型相符的值來進(jìn)行通信。本文主要介紹了Channel的原理和使用技巧,需要的可以參考一下
    2022-11-11
  • Golang函數(shù)重試機(jī)制實(shí)現(xiàn)代碼

    Golang函數(shù)重試機(jī)制實(shí)現(xiàn)代碼

    在編寫應(yīng)用程序時(shí),有時(shí)候會(huì)遇到一些短暫的錯(cuò)誤,例如網(wǎng)絡(luò)請(qǐng)求、服務(wù)鏈接終端失敗等,這些錯(cuò)誤可能導(dǎo)致函數(shù)執(zhí)行失敗,這篇文章主要介紹了Golang函數(shù)重試機(jī)制實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2024-04-04
  • Goland遠(yuǎn)程連接Linux進(jìn)行項(xiàng)目開發(fā)的實(shí)現(xiàn)

    Goland遠(yuǎn)程連接Linux進(jìn)行項(xiàng)目開發(fā)的實(shí)現(xiàn)

    有的時(shí)候我們的開發(fā)代碼要在linux服務(wù)器上運(yùn)行,本文主要介紹了Goland遠(yuǎn)程連接Linux進(jìn)行項(xiàng)目開發(fā)的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-06-06
  • go?goroutine實(shí)現(xiàn)素?cái)?shù)統(tǒng)計(jì)的示例

    go?goroutine實(shí)現(xiàn)素?cái)?shù)統(tǒng)計(jì)的示例

    這篇文章主要介紹了go?goroutine實(shí)現(xiàn)素?cái)?shù)統(tǒng)計(jì),本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • 使用gopacket解析協(xié)議層中的相關(guān)數(shù)據(jù)方式

    使用gopacket解析協(xié)議層中的相關(guān)數(shù)據(jù)方式

    文章介紹使用Wireshark抓取ping數(shù)據(jù)包并保存為pcap格式,通過Go語(yǔ)言gopacket解析,提取IP版本號(hào)、指定標(biāo)識(shí)的數(shù)據(jù)包長(zhǎng)度及應(yīng)用層ICMP字符串內(nèi)容,展示TCP/IP協(xié)議族解析的簡(jiǎn)便方法
    2025-07-07
  • Go語(yǔ)言實(shí)現(xiàn)Snowflake雪花算法

    Go語(yǔ)言實(shí)現(xiàn)Snowflake雪花算法

    雪花算法產(chǎn)生的背景當(dāng)然是twitter高并發(fā)環(huán)境下對(duì)唯一ID生成的需求,得益于twitter內(nèi)部牛的技術(shù),雪花算法能夠流傳于至今并且被廣泛使用,本文就詳細(xì)的介紹一下,感興趣的可以了解一下
    2021-06-06
  • Go語(yǔ)言中io包核心接口示例詳解

    Go語(yǔ)言中io包核心接口示例詳解

    Go的io包提供了io.Reader和io.Writer接口,分別用于數(shù)據(jù)的輸入和輸出,下面這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言中io包核心接口的相關(guān)資料,需要的朋友可以參考下
    2021-12-12
  • Go 高效截取字符串的一些思考

    Go 高效截取字符串的一些思考

    這篇文章主要介紹了Go 高效截取字符串的一些思考,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • 使用?gomonkey?Mock?函數(shù)及方法示例詳解

    使用?gomonkey?Mock?函數(shù)及方法示例詳解

    在 Golang 語(yǔ)言中,寫單元測(cè)試的時(shí)候,不可避免的會(huì)涉及到對(duì)其他函數(shù)及方法的 Mock,即在假設(shè)其他函數(shù)及方法響應(yīng)預(yù)期結(jié)果的同時(shí),校驗(yàn)被測(cè)函數(shù)的響應(yīng)是否符合預(yù)期,這篇文章主要介紹了使用?gomonkey?Mock?函數(shù)及方法,需要的朋友可以參考下
    2022-06-06
  • Golang defer延遲語(yǔ)句的實(shí)現(xiàn)

    Golang defer延遲語(yǔ)句的實(shí)現(xiàn)

    defer擁有注冊(cè)延遲調(diào)用的機(jī)制,本文主要介紹了Golang defer延遲語(yǔ)句的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-07-07

最新評(píng)論

饶阳县| 神木县| 福建省| 溧阳市| 宁城县| 务川| 榆中县| 东城区| 昔阳县| 镇远县| 昔阳县| 饶平县| 内乡县| 东丽区| 平安县| 绥阳县| 龙门县| 龙口市| 施秉县| 静乐县| 米易县| 临颍县| 陇川县| 梨树县| 明溪县| 庆安县| 长葛市| 雷州市| 苏尼特左旗| 峨山| 武陟县| 马龙县| 黎平县| 始兴县| 颍上县| 土默特右旗| 宣威市| 滕州市| 芦山县| 南和县| 吴旗县|