" />

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

go值賦值和引用賦值的使用

 更新時(shí)間:2023年10月31日 15:22:19   作者:liulanba  
本文將介紹Go語(yǔ)言中的值賦值和引用賦值,并比較它們之間的差異,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

值賦值(Value Assignment)

值賦值是指將一個(gè)變量的值復(fù)制給另一個(gè)變量。當(dāng)進(jìn)行值賦值時(shí),會(huì)創(chuàng)建原始值的一個(gè)副本,并將副本賦值給目標(biāo)變量。這意味著目標(biāo)變量和源變量是完全獨(dú)立的,它們引用的是不同的內(nèi)存地址。修改目標(biāo)變量的值不會(huì)影響源變量的值。

var a = 10
var b = a // 值賦值
b = 20
fmt.Println(a) // 輸出: 10
fmt.Println(b) // 輸出: 20

在上述代碼中,將變量 a 的值賦值給變量 b,然后修改 b 的值不會(huì)影響到 a。

引用賦值(Reference Assignment)

引用賦值是指將一個(gè)引用(指針、切片、映射、通道等)復(fù)制給另一個(gè)變量。當(dāng)進(jìn)行引用賦值時(shí),目標(biāo)變量和源變量引用的是相同的底層數(shù)據(jù)。它們指向同一塊內(nèi)存地址。因此,修改目標(biāo)變量會(huì)影響源變量,因?yàn)樗鼈児蚕硐嗤臄?shù)據(jù)。

var slice1 = []int{1, 2, 3}
var slice2 = slice1 // 引用賦值
slice2[1] = 10
fmt.Println(slice1) // 輸出: [1 10 3]
fmt.Println(slice2) // 輸出: [1 10 3]

在上述代碼中,將切片 slice1 的引用賦值給 slice2,然后修改 slice2 中的元素會(huì)影響到 slice1,因?yàn)樗鼈円玫氖峭粔K內(nèi)存。
需要注意的是,值賦值和引用賦值的行為取決于變量的類型。對(duì)于基本類型(如整數(shù)、浮點(diǎn)數(shù)、布爾值等),進(jìn)行值賦值時(shí)會(huì)復(fù)制值;對(duì)于引用類型(如切片、映射、通道等),進(jìn)行引用賦值時(shí)會(huì)共享底層數(shù)據(jù)。

結(jié)構(gòu)體的值賦值在 Go 語(yǔ)言中,結(jié)構(gòu)體類型的賦值操作是進(jìn)行值拷貝

package main

import "fmt"

type Person struct {
	Name string
	Age  int
}

func main() {
	p1 := Person{Name: "Alice", Age: 30}

	p2 := p1

	p3 := Person{Name: p1.Name, Age: p1.Age}

	p1.Age = 31

	fmt.Println(p2) // 輸出: {Alice 30}
	fmt.Println(p3) // 輸出: {Alice 30}
}

在執(zhí)行 p2 := p1 時(shí),會(huì)創(chuàng)建一個(gè)新的結(jié)構(gòu)體變量 p2,并將 p1 的字段值逐個(gè)復(fù)制到 p2 中。

創(chuàng)建了一個(gè)新的結(jié)構(gòu)體變量 p3,并將 p1 的字段值逐個(gè)復(fù)制給 p3。因此,p3 是一個(gè)獨(dú)立的結(jié)構(gòu)體變量,它和 p1 指向不同的內(nèi)存空間。當(dāng)對(duì) p1 的字段進(jìn)行修改時(shí),p3 不會(huì)受到影響,因?yàn)樗鼈円玫氖遣煌膬?nèi)存地址。

結(jié)構(gòu)體的引用賦值結(jié)構(gòu)體的引用賦值是指將一個(gè)結(jié)構(gòu)體變量的引用(指針)賦值給另一個(gè)結(jié)構(gòu)體變量。通過(guò)引用賦值,兩個(gè)結(jié)構(gòu)體變量將引用相同的底層數(shù)據(jù)。

引用賦值適用于結(jié)構(gòu)體類型,包括自定義的結(jié)構(gòu)體類型和內(nèi)置的結(jié)構(gòu)體類型(如切片、映射等)。

type Person struct {
    Name string
    Age  int
}

func main() {
    p1 := Person{Name: "Alice", Age: 30}

    // 引用賦值
    p2 := &p1

    p1.Age = 31

    fmt.Println(p1) // 輸出: {Alice 31}
    fmt.Println(*p2) // 輸出: {Alice 31}
}

在上述代碼中,通過(guò) p2 := &p1 將 p1 的指針賦值給了 p2,實(shí)現(xiàn)了引用賦值。p2 和 p1 都指向相同的結(jié)構(gòu)體數(shù)據(jù)。

因此,當(dāng)修改 p1 的字段值時(shí),通過(guò) p2 訪問(wèn)也會(huì)反映出修改的結(jié)果。這是因?yàn)?p2 和 p1 引用了同一塊內(nèi)存空間,它們共享相同的數(shù)據(jù)。

需要注意的是,引用賦值是一種淺拷貝操作。這意味著只有結(jié)構(gòu)體本身被復(fù)制,而結(jié)構(gòu)體內(nèi)部的引用類型字段(如切片、映射等)不會(huì)被復(fù)制。修改引用類型字段時(shí),會(huì)影響到所有引用該字段的結(jié)構(gòu)體變量。

type Person struct {
    Name string
    Friends []string
}

func main() {
    p1 := Person{Name: "Alice", Friends: []string{"Bob", "Charlie"}}

    // 引用賦值
    p2 := &p1

    p1.Friends[0] = "David"

    fmt.Println(p1) // 輸出: {Alice [David Charlie]}
    fmt.Println(*p2) // 輸出: {Alice [David Charlie]}
}

在上述代碼中,通過(guò)引用賦值將 p1 的指針賦值給了 p2。修改 p1 的 Friends 字段的元素時(shí),通過(guò) p2 訪問(wèn)也會(huì)反映出修改的結(jié)果。這是因?yàn)?p1 和 p2 共享同一個(gè)切片的引用,它們指向相同的底層數(shù)據(jù)。

切片的值賦值copy 是一個(gè)內(nèi)置函數(shù),用于將一個(gè)切片的元素復(fù)制到另一個(gè)切片中

package main

import "fmt"

func main() {
	ls := []int{2, 45, 4, 57}
	var lk = make([]int, 5)
	copy(lk, ls)
	lk[1] = 2222
	fmt.Println(ls, lk)
}

通過(guò) copy 函數(shù)將 ls 的元素復(fù)制到 lk,并修改了 lk[1] 的值,這個(gè)修改只會(huì)影響到 lk 自身,不會(huì)影響 ls。因?yàn)?copy 函數(shù)會(huì)將源切片的元素值復(fù)制到目標(biāo)切片中。在這個(gè)過(guò)程中,源切片和目標(biāo)切片是完全獨(dú)立的,它們分別引用不同的底層數(shù)組。修改目標(biāo)切片 lk 中的元素值不會(huì)影響原始切片 ls,因?yàn)樗鼈円玫氖遣煌膬?nèi)存空間。

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

相關(guān)文章

  • go?語(yǔ)言爬蟲(chóng)庫(kù)goquery的具體使用

    go?語(yǔ)言爬蟲(chóng)庫(kù)goquery的具體使用

    GoQuery是專為Go語(yǔ)言設(shè)計(jì)的一個(gè)強(qiáng)大的HTML解析和查詢庫(kù),本文主要介紹了go語(yǔ)言爬蟲(chóng)庫(kù)goquery的具體使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • Go 切片導(dǎo)致內(nèi)存泄露的幾種原因

    Go 切片導(dǎo)致內(nèi)存泄露的幾種原因

    某些情況下,對(duì)一個(gè)已存在的切片或數(shù)組進(jìn)行切分操作可能會(huì)導(dǎo)致內(nèi)存泄漏,本文主要介紹了Go 切片導(dǎo)致內(nèi)存泄露的幾種原因,感興趣的可以了解一下
    2023-05-05
  • Go語(yǔ)言Gin框架中使用MySQL數(shù)據(jù)庫(kù)的三種方式

    Go語(yǔ)言Gin框架中使用MySQL數(shù)據(jù)庫(kù)的三種方式

    本文主要介紹了Go語(yǔ)言Gin框架中使用MySQL數(shù)據(jù)庫(kù)的三種方式,通過(guò)三種方式實(shí)現(xiàn)增刪改查的操作,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-11-11
  • Go?一般方法與接口方法接收者的差異詳解

    Go?一般方法與接口方法接收者的差異詳解

    這篇文章主要為大家介紹了Go?一般方法與接口方法接收者的差異詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • Swaggo零基礎(chǔ)入門教程

    Swaggo零基礎(chǔ)入門教程

    swagger是一套基于OpenAPI規(guī)范構(gòu)建的開(kāi)源工具,使用RestApi。swagger-ui呈現(xiàn)出來(lái)的是一份可交互式的API文檔,可以直接在文檔頁(yè)面嘗試API的調(diào)用
    2023-01-01
  • 一文搞懂Go語(yǔ)言中文件的讀寫(xiě)與創(chuàng)建

    一文搞懂Go語(yǔ)言中文件的讀寫(xiě)與創(chuàng)建

    這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言中文件是如何實(shí)現(xiàn)讀寫(xiě)與創(chuàng)建的,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Go語(yǔ)言有一定幫助,需要的可以參考一下
    2022-07-07
  • Go語(yǔ)言錯(cuò)誤處理異常捕獲+異常拋出

    Go語(yǔ)言錯(cuò)誤處理異常捕獲+異常拋出

    這篇文章主要介紹了Go語(yǔ)言錯(cuò)誤處理異常捕獲和異常拋出,Go語(yǔ)言的作者認(rèn)為java等語(yǔ)言的錯(cuò)誤處理底層實(shí)現(xiàn)較為復(fù)雜,就實(shí)現(xiàn)了函數(shù)可以返回錯(cuò)誤類型以及簡(jiǎn)單的異常捕獲,雖然簡(jiǎn)單但是也非常精妙,大大的提高了運(yùn)行效率,下文需要的朋友可以參考一下
    2022-02-02
  • Golang實(shí)現(xiàn)Redis網(wǎng)絡(luò)協(xié)議實(shí)例探究

    Golang實(shí)現(xiàn)Redis網(wǎng)絡(luò)協(xié)議實(shí)例探究

    這篇文章主要為大家介紹了Golang實(shí)現(xiàn)Redis網(wǎng)絡(luò)協(xié)議實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • Go實(shí)現(xiàn)一個(gè)配置包詳解

    Go實(shí)現(xiàn)一個(gè)配置包詳解

    在現(xiàn)代軟件開(kāi)發(fā)中,配置文件是不可或缺的一部分。在編寫(xiě) Go 項(xiàng)目時(shí),程序的靈活性和可擴(kuò)展性都需要依賴于配置文件的加載。本文就來(lái)探究下在 Go 項(xiàng)目中如何更加方便的加載和管理配置,感興趣的朋友跟著小編一起來(lái)學(xué)習(xí)吧
    2023-04-04
  • go語(yǔ)言返回1-99之間隨機(jī)數(shù)的方法

    go語(yǔ)言返回1-99之間隨機(jī)數(shù)的方法

    這篇文章主要介紹了go語(yǔ)言返回1-99之間隨機(jī)數(shù)的方法,實(shí)例分析了Go語(yǔ)言中rand的使用技巧,需要的朋友可以參考下
    2015-03-03

最新評(píng)論

米林县| 察哈| 清水县| 蒙山县| 元江| 合水县| 云南省| 竹溪县| 嘉兴市| 芜湖县| 玉溪市| 陇南市| 汝阳县| 广元市| 玉林市| 揭东县| 铁岭县| 水富县| 弥勒县| 株洲县| 兴隆县| 双峰县| 澎湖县| 万盛区| 益阳市| 老河口市| 东海县| 马龙县| 福州市| 始兴县| 怀远县| 霍城县| 延川县| 油尖旺区| 轮台县| 卢氏县| 南昌县| 中江县| 瑞金市| 六盘水市| 噶尔县|