亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Golang 拷貝Array或Slice的操作

 更新時(shí)間:2021年04月29日 08:40:14   作者:neweastsun  
這篇文章主要介紹了Golang 拷貝Array或Slice的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

Golang中Array是值類(lèi)型而slice是引用類(lèi)型。因此兩者之間的賦值或拷貝有些差異,本文帶你了解各自的差異。

1. 拷貝array

前面提及數(shù)組是值類(lèi)型,所以數(shù)組變量名不是指向第一個(gè)元素的指針。事實(shí)上它表示整個(gè)數(shù)組,下面兩者情況將自動(dòng)創(chuàng)建數(shù)組:

數(shù)組變量賦值給另一個(gè)數(shù)組變量

數(shù)組變量傳遞作為函數(shù)參數(shù)

請(qǐng)看示例:

package main
import "fmt"
func main() {
    sample1 := [2]string{"a", "b"}
    fmt.Printf("Sample1 Before: %v\n", sample1)
    sample2 := sample1
    sample2[0] = "c"
    fmt.Printf("Sample1 After assignment: %v\n", sample1)
    fmt.Printf("Sample2: %v\n", sample2)
    test(sample1)
    fmt.Printf("Sample1 After Test Function Call: %v\n", sample1)
}
func test(sample [2]string) {
    sample[0] = "d"
    fmt.Printf("Sample in Test function: %v\n", sample)
}

輸出結(jié)果:

Sample1 Before: [a b]

Sample1 After assignment: [a b]

Sample2:

Sample in Test function: [d b]

Sample1 After Test Function Call: [a b]

我們稍作解釋?zhuān)?/p>

sample1 賦給 sample2 ,然后修改sample2中第一個(gè)元素。打印sample1驗(yàn)證是否有影響,當(dāng)然沒(méi)有改變。這是因?yàn)閟ample1 賦給 sample2,會(huì)創(chuàng)建sample1的拷貝給sample2,故修改sample2不影響sample1.

傳遞sample1給test函數(shù),然后在函數(shù)體內(nèi)修改其第一個(gè)元素。之后打印sample1驗(yàn)證是否有影響,當(dāng)然也沒(méi)有。原因是一樣的,當(dāng)sample1作為參數(shù)傳遞給test時(shí),sample1的拷貝被創(chuàng)建并傳入,因此修改不會(huì)影響原來(lái)sample1.

2. 拷貝slice

Golang內(nèi)置包提供copy函數(shù)能夠拷貝slice,函數(shù)前面如下,其返回拷貝元素個(gè)數(shù):

func copy(dst, src []Type) int

使用copy函數(shù)需要考慮兩種情況:

如果src長(zhǎng)度大于dst,那么僅拷貝dst長(zhǎng)度個(gè)元素

如果dst長(zhǎng)度大于src,那么僅拷貝src長(zhǎng)度個(gè)元素

總結(jié)為拷貝兩者最小長(zhǎng)度元素:min(src,dst)

需要注意的是,一旦拷貝完成,對(duì)目標(biāo)的修改不會(huì)影響源,反之亦然。

我們也通過(guò)示例說(shuō)明:

package main
import "fmt"
func main() {
    src := []int{1, 2, 3, 4, 5}
    dst := make([]int, 5)
    numberOfElementsCopied := copy(dst, src)
    fmt.Printf("Number Of Elements Copied: %d\n", numberOfElementsCopied)
    fmt.Printf("dst: %v\n", dst)
    fmt.Printf("src: %v\n", src)
    //After changing numbers2
    dst[0] = 10
    fmt.Println("\nAfter changing dst")
    fmt.Printf("dst: %v\n", dst)
    fmt.Printf("src: %v\n", src)
}

輸出如下:

Number Of Elements Copied: 5

dst: [1 2 3 4 5]

src: [1 2 3 4 5]

After changing dst

dst: [10 2 3 4 5]

src: [1 2 3 4 5]

3. 總結(jié)

本文介紹了Go Array和Slice直接拷貝。Array是值類(lèi)型直接賦值即拷貝,Slice是引用類(lèi)型,直接賦值是指針會(huì)影響源Slice,但可以通過(guò)內(nèi)置copy函數(shù)實(shí)現(xiàn)賦值功能。

補(bǔ)充:golang字節(jié)數(shù)組拷貝BlockCopy函數(shù)實(shí)現(xiàn)

在C#中,Buffer.BlockCopy(Array, Int32, Array, Int32, Int32) 函數(shù)使用比較廣泛,其含義:

將指定數(shù)目的字節(jié)從起始于特定偏移量的源數(shù)組復(fù)制到起始于特定偏移量的目標(biāo)數(shù)組。

參數(shù) src Array 源緩沖區(qū)。 srcOffset Int32 src 中的字節(jié)偏移量,從零開(kāi)始。 dst Array 目標(biāo)緩沖區(qū)。 dstOffset Int32 dst 中的字節(jié)偏移量,從零開(kāi)始。 count Int32 要復(fù)制的字節(jié)數(shù)。

go語(yǔ)言中實(shí)現(xiàn)如下:

func blockCopy(src []byte, srcOffset int, dst []byte, dstOffset, count int) (bool, error) {
    srcLen := len(src)
    if srcOffset > srcLen || count > srcLen || srcOffset+count > srcLen {
        return false, errors.New("源緩沖區(qū) 索引超出范圍")
    }
    dstLen := len(dst)
    if dstOffset > dstLen || count > dstLen || dstOffset+count > dstLen {
        return false, errors.New("目標(biāo)緩沖區(qū) 索引超出范圍")
    }
    index := 0
    for i := srcOffset; i < srcOffset+count; i++ {
        dst[dstOffset+index] = src[srcOffset+index]
        index++
    }
    return true, nil
}

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • Go語(yǔ)言的type?func()用法詳解

    Go語(yǔ)言的type?func()用法詳解

    在Go語(yǔ)言中,函數(shù)的基本組成為:關(guān)鍵字func、函數(shù)名、參數(shù)列表、返回值、函數(shù)體和返回語(yǔ)句,這篇文章主要介紹了Go語(yǔ)言的type?func()用法,需要的朋友可以參考下
    2022-03-03
  • Go設(shè)計(jì)模式之迭代器模式講解和代碼示例

    Go設(shè)計(jì)模式之迭代器模式講解和代碼示例

    迭代器是一種行為設(shè)計(jì)模式, 讓你能在不暴露復(fù)雜數(shù)據(jù)結(jié)構(gòu)內(nèi)部細(xì)節(jié)的情況下遍歷其中所有的元素,本文將為大家詳細(xì)介紹Go 迭代器模式,文中詳細(xì)的代碼示例,需要的朋友可以參考下
    2023-07-07
  • Go語(yǔ)言學(xué)習(xí)otns示例分析

    Go語(yǔ)言學(xué)習(xí)otns示例分析

    這篇文章主要為大家介紹了Go語(yǔ)言學(xué)習(xí)otns示例分析詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • 自定義Go?Json的序列化方法譯文

    自定義Go?Json的序列化方法譯文

    這篇文章主要為大家介紹了自定義Go?Json序列化方法譯文,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • go語(yǔ)言中for?range使用方法及避坑指南

    go語(yǔ)言中for?range使用方法及避坑指南

    Go中的for range組合可以和方便的實(shí)現(xiàn)對(duì)一個(gè)數(shù)組或切片進(jìn)行遍歷,但是在某些情況下使用for range時(shí)很可能就會(huì)被"坑",下面這篇文章主要給大家介紹了關(guān)于go語(yǔ)言中for?range使用方法及避坑指南的相關(guān)資料,需要的朋友可以參考下
    2022-09-09
  • Goland遠(yuǎn)程連接Linux進(jìn)行項(xiàng)目開(kāi)發(fā)的實(shí)現(xiàn)

    Goland遠(yuǎn)程連接Linux進(jìn)行項(xiàng)目開(kāi)發(fā)的實(shí)現(xiàn)

    有的時(shí)候我們的開(kāi)發(fā)代碼要在linux服務(wù)器上運(yùn)行,本文主要介紹了Goland遠(yuǎn)程連接Linux進(jìn)行項(xiàng)目開(kāi)發(fā)的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-06-06
  • 在Linux系統(tǒng)中安裝Go語(yǔ)言的詳細(xì)教程

    在Linux系統(tǒng)中安裝Go語(yǔ)言的詳細(xì)教程

    這篇文章主要介紹了在Linux系統(tǒng)中安裝Go語(yǔ)言的詳細(xì)教程,由于國(guó)內(nèi)很多人對(duì)谷歌的盲目追捧,導(dǎo)致Go語(yǔ)言在國(guó)內(nèi)的人氣遠(yuǎn)超國(guó)外...需要的朋友可以參考下
    2015-06-06
  • Go模塊布局管理文檔翻譯理解

    Go模塊布局管理文檔翻譯理解

    這篇文章主要為大家介紹了Go模塊布局管理文檔翻譯理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Go語(yǔ)言排序與接口實(shí)例分析

    Go語(yǔ)言排序與接口實(shí)例分析

    這篇文章主要介紹了Go語(yǔ)言排序與接口,實(shí)例分析了排序與接口的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02
  • Golang學(xué)習(xí)筆記(三):控制流

    Golang學(xué)習(xí)筆記(三):控制流

    這篇文章主要介紹了Golang學(xué)習(xí)筆記(三):控制流,本文講解了IF、FOR、SWITCH、goto、break、continue等控制流語(yǔ)句的使用實(shí)例,需要的朋友可以參考下
    2015-05-05

最新評(píng)論