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。當(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?urfave/cli庫簡單應(yīng)用示例詳解
這篇文章主要為大家介紹了Golang?urfave/cli庫簡單應(yīng)用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
golang 中string和int類型相互轉(zhuǎn)換
這篇文章主要介紹了golang 中string和int類型相互轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02
Golang哈希算法實現(xiàn)配置文件的監(jiān)控功能詳解
這篇文章主要介紹了Golang哈希算法實現(xiàn)配置文件的監(jiān)控功能,哈希和加密類似,唯一區(qū)別是哈希是單項的,即哈希后的數(shù)據(jù)無法解密,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-03-03

