" />

欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

值賦值(Value Assignment)

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

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

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

引用賦值(Reference Assignment)

引用賦值是指將一個引用(指針、切片、映射、通道等)復制給另一個變量。當進行引用賦值時,目標變量和源變量引用的是相同的底層數(shù)據(jù)。它們指向同一塊內(nèi)存地址。因此,修改目標變量會影響源變量,因為它們共享相同的數(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 中的元素會影響到 slice1,因為它們引用的是同一塊內(nèi)存。
需要注意的是,值賦值和引用賦值的行為取決于變量的類型。對于基本類型(如整數(shù)、浮點數(shù)、布爾值等),進行值賦值時會復制值;對于引用類型(如切片、映射、通道等),進行引用賦值時會共享底層數(shù)據(jù)。

結構體的值賦值在 Go 語言中,結構體類型的賦值操作是進行值拷貝

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 時,會創(chuàng)建一個新的結構體變量 p2,并將 p1 的字段值逐個復制到 p2 中。

創(chuàng)建了一個新的結構體變量 p3,并將 p1 的字段值逐個復制給 p3。因此,p3 是一個獨立的結構體變量,它和 p1 指向不同的內(nèi)存空間。當對 p1 的字段進行修改時,p3 不會受到影響,因為它們引用的是不同的內(nèi)存地址。

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

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

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

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

因此,當修改 p1 的字段值時,通過 p2 訪問也會反映出修改的結果。這是因為 p2 和 p1 引用了同一塊內(nèi)存空間,它們共享相同的數(shù)據(jù)。

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

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

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

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

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

通過 copy 函數(shù)將 ls 的元素復制到 lk,并修改了 lk[1] 的值,這個修改只會影響到 lk 自身,不會影響 ls。因為 copy 函數(shù)會將源切片的元素值復制到目標切片中。在這個過程中,源切片和目標切片是完全獨立的,它們分別引用不同的底層數(shù)組。修改目標切片 lk 中的元素值不會影響原始切片 ls,因為它們引用的是不同的內(nèi)存空間。

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

相關文章

  • Go語言高效I/O并發(fā)處理雙緩沖和Exchanger模式實例探索

    Go語言高效I/O并發(fā)處理雙緩沖和Exchanger模式實例探索

    這篇文章主要介紹了Go語言高效I/O并發(fā)處理雙緩沖和Exchanger模式實例探索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • Go語言使用Buffer實現(xiàn)高性能處理字節(jié)和字符

    Go語言使用Buffer實現(xiàn)高性能處理字節(jié)和字符

    在?Go?中,bytes.Buffer?是一個非常高效的類型,用于處理字節(jié)數(shù)據(jù)的讀寫操作,本文將詳細介紹一下如何使用Buffer實現(xiàn)高性能處理字節(jié)和字符,有需要的小伙伴可以了解下
    2025-01-01
  • 詳解Go中Set的實現(xiàn)方式

    詳解Go中Set的實現(xiàn)方式

    這篇文章主要介紹了詳解Go中Set的實現(xiàn)方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-09-09
  • jenkins配置golang?代碼工程自動發(fā)布的實現(xiàn)方法

    jenkins配置golang?代碼工程自動發(fā)布的實現(xiàn)方法

    這篇文章主要介紹了jenkins配置golang?代碼工程自動發(fā)布,jks是個很好的工具,使用方法也很多,我只用了它簡單的功能,對jenkins配置golang相關知識感興趣的朋友一起看看吧
    2022-07-07
  • Go語言實現(xiàn)Snowflake雪花算法

    Go語言實現(xiàn)Snowflake雪花算法

    雪花算法產(chǎn)生的背景當然是twitter高并發(fā)環(huán)境下對唯一ID生成的需求,得益于twitter內(nèi)部牛的技術,雪花算法能夠流傳于至今并且被廣泛使用,本文就詳細的介紹一下,感興趣的可以了解一下
    2021-06-06
  • 通過Golang編寫一個AES加密解密工具

    通過Golang編寫一個AES加密解密工具

    這篇文章主要為大家詳細介紹了如何利用Golang制作一個AES加密解密工具,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2022-05-05
  • golang整合日志zap的實現(xiàn)示例

    golang整合日志zap的實現(xiàn)示例

    Go語言中的zap庫提供了強大的日志管理功能,支持日志記錄到文件、日志切割、多日志級別、結構化日志輸出等,它通過三種方法zap.NewProduction()、zap.NewDevelopment()和zap.NewExample(),快速構建適用于不同環(huán)境的logger,感興趣的可以了解一下
    2024-10-10
  • 使用Go語言編寫一個NTP服務器的流程步驟

    使用Go語言編寫一個NTP服務器的流程步驟

    NTP服務器【Network?Time?Protocol(NTP)】是用來使計算機時間同步化的一種協(xié)議,為了確保封閉局域網(wǎng)內(nèi)多個服務器的時間同步,我們計劃部署一個網(wǎng)絡時間同步服務器(NTP服務器),本文給大家介紹了使用Go語言編寫一個NTP服務器的流程步驟,需要的朋友可以參考下
    2024-11-11
  • golang使用go test輸出單元測試覆蓋率的方式

    golang使用go test輸出單元測試覆蓋率的方式

    單元測試覆蓋率是衡量代碼質(zhì)量的一個重要指標,重要的代碼文件覆蓋率應該至少達到80%以上,Java 可以通過JaCoCo 統(tǒng)計覆蓋率,那么go 項目如何進行代碼覆蓋率測試呢,本文將給大家詳細的介紹一下golang使用go test輸出單元測試覆蓋率的方式,需要的朋友可以參考下
    2024-02-02
  • Go中crypto/rsa庫的高效使用指南

    Go中crypto/rsa庫的高效使用指南

    本文主要介紹了Go中crypto/rsa庫的高效使用指南,從 RSA 的基本原理到 crypto/rsa 庫的實際應用,具有一定的參考價值,感興趣的可以了解一下
    2024-02-02

最新評論