golang copy函數(shù)使用的坑
之前用 copy 不多,本以為它是個(gè)很方便的函數(shù),沒想到在做練習(xí)題時(shí)竟還是被它坑了。是我對他期望太多了。
func copy(dst, src []Type) int
基本認(rèn)識:
- 它只能用于切片,不能用于 map 等任何其他類型
- 它返回結(jié)果為一個(gè) int 型值,表示 copy 的長度
坑位一:切片 dst 需要先初始化長度
不是你定義好類型,就能將 src 完全 copy 到 dst 的,你需要初始化長度。
- 如果 dst 長度小于 src 的長度,則 copy 部分;
- 如果大于,則全部拷貝過來,只是沒占滿 dst 的坑位而已;
- 相等時(shí)剛好不多不少 copy 過來。
坑位二:源切片中元素類型為引用類型時(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])) // 注意初始化長度 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語言編譯程序從后臺運(yùn)行,不出現(xiàn)dos窗口的操作
這篇文章主要介紹了Go語言編譯程序從后臺運(yùn)行,不出現(xiàn)dos窗口的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04淺談?dòng)肎o構(gòu)建不可變的數(shù)據(jù)結(jié)構(gòu)的方法
這篇文章主要介紹了用Go構(gòu)建不可變的數(shù)據(jù)結(jié)構(gòu)的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09goland 實(shí)現(xiàn)websocket server的示例代碼
本文主要介紹了goland 實(shí)現(xiàn)websocket server的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06Linux環(huán)境下編譯并運(yùn)行g(shù)o項(xiàng)目的全過程
Go語言是Google的開源編程語言,廣泛應(yīng)用于云計(jì)算、分布式系統(tǒng)開發(fā)等領(lǐng)域,在Linux上也有大量的應(yīng)用場景,這篇文章主要給大家介紹了關(guān)于Linux環(huán)境下編譯并運(yùn)行g(shù)o項(xiàng)目的相關(guān)資料,需要的朋友可以參考下2023-11-11go語言規(guī)范RESTful?API業(yè)務(wù)錯(cuò)誤處理
這篇文章主要為大家介紹了go語言規(guī)范RESTful?API業(yè)務(wù)錯(cuò)誤處理方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03Go利用反射reflect實(shí)現(xiàn)獲取接口變量信息
反射是通過實(shí)體對象獲取反射對象(Value、Type),然后可以操作相應(yīng)的方法。本文將利用Go語言中的反射reflect實(shí)現(xiàn)獲取接口變量信息,需要的可以參考一下2022-05-05golang?xorm?自定義日志記錄器之使用zap實(shí)現(xiàn)日志輸出、切割日志(最新)
這篇文章主要介紹了golang?xorm?自定義日志記錄器,使用zap實(shí)現(xiàn)日志輸出、切割日志,包括連接postgresql數(shù)據(jù)庫的操作方法及?zap日志工具?,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-10-10