golang copy函數(shù)使用的坑
之前用 copy 不多,本以為它是個很方便的函數(shù),沒想到在做練習(xí)題時竟還是被它坑了。是我對他期望太多了。
func copy(dst, src []Type) int
基本認識:
- 它只能用于切片,不能用于 map 等任何其他類型
- 它返回結(jié)果為一個 int 型值,表示 copy 的長度
坑位一:切片 dst 需要先初始化長度
不是你定義好類型,就能將 src 完全 copy 到 dst 的,你需要初始化長度。
- 如果 dst 長度小于 src 的長度,則 copy 部分;
- 如果大于,則全部拷貝過來,只是沒占滿 dst 的坑位而已;
- 相等時剛好不多不少 copy 過來。
坑位二:源切片中元素類型為引用類型時,拷貝的是引用
由于只 copy 切片中的元素,所以如果切片元素的類型是引用類型,那么 copy 的也將是個引用。
如下面例子,matA 和 matB 地址不一樣,但 matA[0] 和 matB[0] 的地址是一樣的。
func wrongCopyMatrix() {
matA := [][]int{
{0, 1, 1, 0},
{0, 1, 1, 1},
{1, 1, 1, 0},
}
matB := make([][]int, len(matA))
copy(matB, matA)
fmt.Printf("%p, %p\n", matA, matA[0]) // 0xc0000c0000, 0xc0000c2000
fmt.Printf("%p, %p\n", matB, matB[0]) // 0xc0000c0050, 0xc0000c2000
}
如果想 copy 多維切片中的每一個切片類型的元素,那么你需要將每個切片元素進行 初始化 并 拷貝。注意是兩步:先 初始化,再 拷貝。
正確的拷貝一個多維數(shù)組:
func rightCopyMatrix() {
matA := [][]int{
{0, 1, 1, 0},
{0, 1, 1, 1},
{1, 1, 1, 0},
}
matB := make([][]int, len(matA))
for i := range matA {
matB[i] = make([]int, len(matA[i])) // 注意初始化長度
copy(matB[i], matA[i])
}
fmt.Printf("%p, %p\n", matA, matA[0]) // 0xc00005c050, 0xc000018560
fmt.Printf("%p, %p\n", matB, matB[0]) // 0xc00005c0a0, 0xc0000185c0
}
到此這篇關(guān)于golang copy函數(shù)使用的坑的文章就介紹到這了,更多相關(guān)golang copy函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
教你用go語言實現(xiàn)比特幣交易功能(Transaction)
每一筆比特幣交易都會創(chuàng)造輸出,輸出都會被區(qū)塊鏈記錄下來。給某個人發(fā)送比特幣,實際上意味著創(chuàng)造新的 UTXO 并注冊到那個人的地址,可以為他所用,今天通過本文給大家分享go語言實現(xiàn)比特幣交易功能,一起看看吧2021-05-05
Golang實現(xiàn)優(yōu)雅的將struct轉(zhuǎn)換為map
在項目實踐中,有時候我們需要將struct結(jié)構(gòu)體轉(zhuǎn)為map映射表,然后基于map做數(shù)據(jù)裁剪或操作。那么下面我來介紹下常用的兩種轉(zhuǎn)換方式,希望對大家有所幫助2023-01-01

