golang copy函數(shù)使用的坑
之前用 copy 不多,本以為它是個(gè)很方便的函數(shù),沒(méi)想到在做練習(xí)題時(shí)竟還是被它坑了。是我對(duì)他期望太多了。
func copy(dst, src []Type) int
基本認(rèn)識(shí):
- 它只能用于切片,不能用于 map 等任何其他類型
- 它返回結(jié)果為一個(gè) int 型值,表示 copy 的長(zhǎng)度
坑位一:切片 dst 需要先初始化長(zhǎng)度
不是你定義好類型,就能將 src 完全 copy 到 dst 的,你需要初始化長(zhǎng)度。
- 如果 dst 長(zhǎng)度小于 src 的長(zhǎng)度,則 copy 部分;
- 如果大于,則全部拷貝過(guò)來(lái),只是沒(méi)占滿 dst 的坑位而已;
- 相等時(shí)剛好不多不少 copy 過(guò)來(lái)。
坑位二:源切片中元素類型為引用類型時(shí),拷貝的是引用
由于只 copy 切片中的元素,所以如果切片元素的類型是引用類型,那么 copy 的也將是個(gè)引用。
如下面例子,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 多維切片中的每一個(gè)切片類型的元素,那么你需要將每個(gè)切片元素進(jìn)行 初始化 并 拷貝。注意是兩步:先 初始化,再 拷貝。
正確的拷貝一個(gè)多維數(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])) // 注意初始化長(zhǎng)度
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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
教你用go語(yǔ)言實(shí)現(xiàn)比特幣交易功能(Transaction)
每一筆比特幣交易都會(huì)創(chuàng)造輸出,輸出都會(huì)被區(qū)塊鏈記錄下來(lái)。給某個(gè)人發(fā)送比特幣,實(shí)際上意味著創(chuàng)造新的 UTXO 并注冊(cè)到那個(gè)人的地址,可以為他所用,今天通過(guò)本文給大家分享go語(yǔ)言實(shí)現(xiàn)比特幣交易功能,一起看看吧2021-05-05
Go設(shè)計(jì)模式之訪問(wèn)者模式講解和代碼示例
訪問(wèn)者是一種行為設(shè)計(jì)模式, 允許你在不修改已有代碼的情況下向已有類層次結(jié)構(gòu)中增加新的行為,本文將通過(guò)代碼示例給大家詳細(xì)的介紹一下Go設(shè)計(jì)模式之訪問(wèn)者模式,需要的朋友可以參考下2023-08-08
Go設(shè)計(jì)模式之狀態(tài)模式講解和代碼示例
狀態(tài)是一種行為設(shè)計(jì)模式,?讓你能在一個(gè)對(duì)象的內(nèi)部狀態(tài)變化時(shí)改變其行為,該模式將與狀態(tài)相關(guān)的行為抽取到獨(dú)立的狀態(tài)類中,?讓原對(duì)象將工作委派給這些類的實(shí)例,?而不是自行進(jìn)行處理,本文將通過(guò)代碼示例給大家簡(jiǎn)單的介紹一下Go狀態(tài)模式2023-08-08
Golang實(shí)現(xiàn)優(yōu)雅的將struct轉(zhuǎn)換為map
在項(xiàng)目實(shí)踐中,有時(shí)候我們需要將struct結(jié)構(gòu)體轉(zhuǎn)為map映射表,然后基于map做數(shù)據(jù)裁剪或操作。那么下面我來(lái)介紹下常用的兩種轉(zhuǎn)換方式,希望對(duì)大家有所幫助2023-01-01
Go實(shí)現(xiàn)快速生成固定長(zhǎng)度的隨機(jī)字符串
這篇文章主要為大家詳細(xì)介紹了怎樣在Go中簡(jiǎn)單快速地生成固定長(zhǎng)度的隨機(jī)字符串,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以學(xué)習(xí)一下2022-10-10

