Go語言地址引用的問題解決
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。當然在容量足夠的情況下,不會開辟新的內(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、指針等地址引用的變量,會操作同一塊地址對應的數(shù)據(jù),在操作時也特別留意。
到此這篇關(guān)于Go語言地址引用的問題解決的文章就介紹到這了,更多相關(guān)Go語言地址引用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
go中Excelize處理excel表實現(xiàn)帶數(shù)據(jù)校驗的文件導出
本文主要介紹了go中Excelize處理excel表實現(xiàn)帶數(shù)據(jù)校驗的文件導出,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-06-06
golang如何通過viper讀取config.yaml文件
這篇文章主要介紹了golang通過viper讀取config.yaml文件,圍繞golang讀取config.yaml文件的相關(guān)資料展開詳細內(nèi)容,需要的小伙伴可以參考一下2022-03-03
jenkins配置golang?代碼工程自動發(fā)布的實現(xiàn)方法
這篇文章主要介紹了jenkins配置golang?代碼工程自動發(fā)布,jks是個很好的工具,使用方法也很多,我只用了它簡單的功能,對jenkins配置golang相關(guān)知識感興趣的朋友一起看看吧2022-07-07
Golang信號處理及如何實現(xiàn)進程的優(yōu)雅退出詳解
這篇文章主要給大家介紹了關(guān)于Golang信號處理及如何實現(xiàn)進程的優(yōu)雅退出的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。2018-03-03
Go檢查結(jié)構(gòu)體中是否存在某個字段及創(chuàng)建結(jié)構(gòu)體切片或映射
這篇文章主要為大家介紹了Go檢查結(jié)構(gòu)體中是否存在某個字段及創(chuàng)建結(jié)構(gòu)體切片或映射實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2024-01-01

