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

Go語言地址引用的問題解決

 更新時間:2025年11月21日 09:25:57   作者:好易學(xué)·數(shù)據(jù)結(jié)構(gòu)  
本文主要介紹了Go語言中channel和slice的引用行為,它們在操作時會共享同一塊數(shù)據(jù),及在追加數(shù)據(jù)時可能開辟新內(nèi)存的情況,下面就來詳細(xì)的介紹一下,感興趣的可以了解一下

1、channel

先看以下代碼:

package main

import "fmt"

func main() {
	ch1 := make(chan int, 3)
	ch2 := ch1
	ch1 <- 123
	ch2 <- 456
	fmt.Println(ch1, ch2)     //輸出地址是否一樣?  TODO:打印結(jié)果是?
	fmt.Println(<-ch2, <-ch1) // ch2中的數(shù)據(jù)是:456; ch1中的數(shù)據(jù)是123;TODO:打印結(jié)果是?
}

輸出結(jié)果:

代碼分析:

在以上代碼中,新定義的變量ch2:=ch1 ;ch2是地址引用,ch1,ch2地址指向的是同一塊數(shù)據(jù),ch1、ch2都可以改變數(shù)據(jù)。

2、slice

看看以下代碼:

package main

import "fmt"

func main() {
	s := make([]int, 3)
	s1 := s
	s2 := s
	s[0] = 123
	s1[1] = 456
	s2[2] = 789
	fmt.Println("原始切片:", s)
	fmt.Println("賦值切片:", s1)
	fmt.Println("賦值切片:", s2)
	fmt.Println("切片的長度、容量為:", len(s), cap(s))
	fmt.Printf("追加之前的地址:s:%p ;s1:%p; s2:%p\n",s,s1,s2)
	fmt.Println("====執(zhí)行append操作====")
	s2 = append(s2, 123)
	fmt.Printf("追加之后的地址:s:%p ;s1:%p; s2:%p\n",s,s1,s2)
	fmt.Println("原始切片s:", s)
	fmt.Println("賦值切片s1:", s1)
	fmt.Println("賦值切片s2:", s2)
}

輸出結(jié)果:

代碼分析:起初,s,s1,s2都指向同一塊數(shù)據(jù)。所以任意一個變量修改了該塊數(shù)據(jù),其他變量查到的都是修改之后的數(shù)據(jù)。

指向:

s2 = append(s2, 123),會在末尾追加一個元素,由于現(xiàn)有s2的
cap(s)=3, len(s)=3;

在追加數(shù)據(jù)時,容量已經(jīng)不夠,會開辟新的內(nèi)存,將現(xiàn)有數(shù)據(jù)s2拷貝,形成新的s2。當(dāng)然在容量足夠的情況下,不會開辟新的內(nèi)存空間。

再來看以下代碼:(容量大于append的數(shù)據(jù)數(shù)量)

package main

import "fmt"

func main() {
	s := make([]int, 3,6)
	s1 := s
	s2 := s
	s[0] = 123
	s1[1] = 456
	s2[2] = 789
	fmt.Println("原始切片:", s)
	fmt.Println("賦值切片:", s1)
	fmt.Println("賦值切片:", s2)
	fmt.Println("切片的長度、容量為:", len(s), cap(s))
	fmt.Printf("追加之前的地址:s:%p ;s1:%p; s2:%p\n",s,s1,s2)
	fmt.Println("====執(zhí)行append操作====")
	s2 = append(s2, 123)
	fmt.Printf("追加之后的地址:s:%p ;s1:%p; s2:%p\n",s,s1,s2)
	s[0]=888 // TODO:會修改s1、s2嗎
	fmt.Println("原始切片s:", s)
	fmt.Println("賦值切片s1:", s1)
	fmt.Println("賦值切片s2:", s2)
}

輸出效果:

在以上代碼中添加內(nèi)容:

package main

import "fmt"

func main() {
	s := make([]int, 3,6)
	s1 := s
	s2 := s
	s[0] = 123
	s1[1] = 456
	s2[2] = 789
	fmt.Println("原始切片:", s)
	fmt.Println("賦值切片:", s1)
	fmt.Println("賦值切片:", s2)
	fmt.Println("切片的長度、容量為:", len(s), cap(s))
	fmt.Printf("追加之前的地址:s:%p ;s1:%p; s2:%p\n",s,s1,s2)
	fmt.Println("====執(zhí)行append操作====")
	s2 = append(s2, 123)
	fmt.Printf("追加之后的地址:s:%p ;s1:%p; s2:%p\n",s,s1,s2)
	s[0]=888 // TODO:會修改s1、s2嗎
	fmt.Println("原始切片s:", s)
	fmt.Println("賦值切片s1:", s1)
	fmt.Println("賦值切片s2:", s2)
	fmt.Println("執(zhí)行以下操作,輸出結(jié)果又是什么呢?")
	s = append(s, 666)
	fmt.Println("原始切片s:", s)
	fmt.Println("賦值切片s1:", s1)
	fmt.Println("賦值切片s2:", s2)
}

特別說明:Go語言為了節(jié)省內(nèi)存空間,對于切片、map、channel、指針等地址引用的變量,會操作同一塊地址對應(yīng)的數(shù)據(jù),在操作時也特別留意。

到此這篇關(guān)于Go語言地址引用的問題解決的文章就介紹到這了,更多相關(guān)Go語言地址引用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • golang簡單位運算示例

    golang簡單位運算示例

    這篇文章主要介紹了golang簡單位運算,包括位移運算、取反及位與位或等運算,需要的朋友可以參考下
    2016-07-07
  • Go語言二維數(shù)組的傳參方式

    Go語言二維數(shù)組的傳參方式

    這篇文章主要介紹了Go語言二維數(shù)組的傳參方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • 一文讀懂go中semaphore(信號量)源碼

    一文讀懂go中semaphore(信號量)源碼

    這篇文章主要介紹了一文讀懂go中semaphore(信號量)源碼的相關(guān)知識,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • go語言中的template使用示例詳解

    go語言中的template使用示例詳解

    在Go語言中,可以通過text/template和html/template包來處理模板,本文提供了一個使用Go模板的基本示例,包括導(dǎo)入包、創(chuàng)建數(shù)據(jù)結(jié)構(gòu)、定義模板、執(zhí)行模板及運行程序,通過這些步驟,可以輸出一個格式化的YAML配置
    2024-10-10
  • Golang?urfave/cli庫簡單應(yīng)用示例詳解

    Golang?urfave/cli庫簡單應(yīng)用示例詳解

    這篇文章主要為大家介紹了Golang?urfave/cli庫簡單應(yīng)用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • Golang Type關(guān)鍵字的使用

    Golang Type關(guān)鍵字的使用

    Type關(guān)鍵字在Go語言中作用很重要,比如定義結(jié)構(gòu)體,接口,還可以自定義類型,定義類型別名等,具有一定的參考價值,感興趣的可以了解一下
    2023-11-11
  • Go語言快速入門圖文教程

    Go語言快速入門圖文教程

    Go是 Goolge 開發(fā)的一種靜態(tài)型、編譯型、并發(fā)型,并具有垃圾回收功能的語言,Go 語言上手非常容易,它的風(fēng)格類似于 C 語言,Go 語言號稱是互聯(lián)網(wǎng)時代的 C 語言,那么它到底有多火呢,一起看看吧
    2021-05-05
  • golang 中string和int類型相互轉(zhuǎn)換

    golang 中string和int類型相互轉(zhuǎn)換

    這篇文章主要介紹了golang 中string和int類型相互轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • 詳解Golang中的通道機(jī)制與應(yīng)用

    詳解Golang中的通道機(jī)制與應(yīng)用

    這篇文章主要來和大家一起深入探討了Go語言中通道(Channel)的各個方面,文章詳細(xì)解析了通道的類型、操作方法以及垃圾回收機(jī)制,有需要的可以了解下
    2023-10-10
  • Golang哈希算法實現(xiàn)配置文件的監(jiān)控功能詳解

    Golang哈希算法實現(xiàn)配置文件的監(jiān)控功能詳解

    這篇文章主要介紹了Golang哈希算法實現(xiàn)配置文件的監(jiān)控功能,哈希和加密類似,唯一區(qū)別是哈希是單項的,即哈希后的數(shù)據(jù)無法解密,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-03-03

最新評論

浦县| 敖汉旗| 湘潭县| 保山市| 阿荣旗| 任丘市| 眉山市| 乐都县| 沁阳市| 沂南县| 同德县| 全南县| 清丰县| 武乡县| 泗洪县| 凤城市| 丹凤县| 铜鼓县| 连平县| 曲松县| 承德市| 佛学| 扎兰屯市| 伽师县| 鞍山市| 石家庄市| 东辽县| 张家界市| 南陵县| 南澳县| 五原县| 巍山| 谢通门县| 海林市| 泾川县| 新化县| 乌拉特前旗| 昌吉市| 新野县| 鄯善县| 龙江县|