Golang 元素值在经过通道传递时会被复制,这个复制是浅复制
生活随笔
收集整理的這篇文章主要介紹了
Golang 元素值在经过通道传递时会被复制,这个复制是浅复制
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1. channel 元素值為切片
package mainimport ("fmt"
)func main() {ch := make(chan []int, 3)s := []int{1, 3, 4}ch <- sfmt.Printf("s length is %d, cap is %d\n", len(ch), cap(ch))fmt.Printf("s address is %p\n", &s)r := <-chr[0] = 2// 證明了channel的復制是淺拷貝fmt.Printf("s is %#v\n", s)fmt.Printf("r is %#v\n", r)fmt.Printf("r address is %p\n", &r)}
運行結果:
s length is 1, cap is 3
s address is 0xc00000c060
s is []int{2, 3, 4}
r is []int{2, 3, 4}
r address is 0xc00000c080
可以看到在接收端修改切片元素值,發送端的切片也被改變。
2. channel 元素值為數組
package mainimport ("fmt"
)func main() {ch := make(chan [3]int, 3)s := [3]int{1, 3, 4}ch <- sfmt.Printf("s length is %d, cap is %d\n", len(ch), cap(ch))fmt.Printf("s address is %p\n", &s)r := <-chr[0] = 2// 證明了channel的復制是淺拷貝fmt.Printf("s is %#v\n", s)fmt.Printf("r is %#v\n", r)fmt.Printf("r address is %p\n", &r)}
輸出結果:
s length is 1, cap is 3
s address is 0xc0000aa000
s is [3]int{1, 3, 4}
r is [3]int{2, 3, 4}
r address is 0xc0000aa040
Go 語言里沒有深層復制。只有淺復制 。數組是值類型,所以會被完全復制。
淺拷貝只是拷貝值以及值中直接包含的東西,深拷貝就是把所有深層次的結構一并拷貝。
首先你得理解,int 、float32 、string 以及 []int 這些類型都是值類型。對于值類型來說沒有 “深層” 只有 “淺層”。也就是說,這類值只有一層,只包含值本身(不像 map 和 slice 那樣包含了指向底層數據結構的指針)。對這類值的拷貝就是淺拷貝,根本就不存在深拷貝的概念。
淺表復制,只復制元素值,元素值里面再指向的東西就不會復制了。
總結
以上是生活随笔為你收集整理的Golang 元素值在经过通道传递时会被复制,这个复制是浅复制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021年中国服装行业分析报告-产业规模
- 下一篇: Go 中切片索引与 Python 中列表