中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在Golang對Array和Slice進行拷貝

發布時間:2021-04-29 15:49:30 來源:億速云 閱讀:158 作者:Leah 欄目:開發技術

怎么在Golang對Array和Slice進行拷貝?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

golang的優點

golang是一種編譯語言,可以將代碼編譯為機器代碼,編譯后的二進制文件可以直接部署到目標機器而無需額外的依賴,所以golang的性能優于其他的解釋性語言,且可以在golang中使用goroutine來實現并發性,它提供了一個非常優雅的goroutine調度程序系統,可以很容易地生成數百萬個goroutine。

1. 拷貝array

前面提及數組是值類型,所以數組變量名不是指向第一個元素的指針。事實上它表示整個數組,下面兩者情況將自動創建數組:

數組變量賦值給另一個數組變量

數組變量傳遞作為函數參數

請看示例:

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)
}

輸出結果:

Sample1 Before: [a b]

Sample1 After assignment: [a b]

Sample2:

Sample in Test function: [d b]

Sample1 After Test Function Call: [a b]

我們稍作解釋:

sample1 賦給 sample2 ,然后修改sample2中第一個元素。打印sample1驗證是否有影響,當然沒有改變。這是因為sample1 賦給 sample2,會創建sample1的拷貝給sample2,故修改sample2不影響sample1.

傳遞sample1給test函數,然后在函數體內修改其第一個元素。之后打印sample1驗證是否有影響,當然也沒有。原因是一樣的,當sample1作為參數傳遞給test時,sample1的拷貝被創建并傳入,因此修改不會影響原來sample1.

2. 拷貝slice

Golang內置包提供copy函數能夠拷貝slice,函數前面如下,其返回拷貝元素個數:

func copy(dst, src []Type) int

使用copy函數需要考慮兩種情況:

如果src長度大于dst,那么僅拷貝dst長度個元素

如果dst長度大于src,那么僅拷貝src長度個元素

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

需要注意的是,一旦拷貝完成,對目標的修改不會影響源,反之亦然。

我們也通過示例說明:

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. 總結

本文介紹了Go Array和Slice直接拷貝。Array是值類型直接賦值即拷貝,Slice是引用類型,直接賦值是指針會影響源Slice,但可以通過內置copy函數實現賦值功能。

補充:golang字節數組拷貝BlockCopy函數實現

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

將指定數目的字節從起始于特定偏移量的源數組復制到起始于特定偏移量的目標數組。

參數 src Array 源緩沖區。 srcOffset Int32 src 中的字節偏移量,從零開始。 dst Array 目標緩沖區。 dstOffset Int32 dst 中的字節偏移量,從零開始。 count Int32 要復制的字節數。

go語言中實現如下:

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("源緩沖區 索引超出范圍")
    }
    dstLen := len(dst)
    if dstOffset > dstLen || count > dstLen || dstOffset+count > dstLen {
        return false, errors.New("目標緩沖區 索引超出范圍")
    }
    index := 0
    for i := srcOffset; i < srcOffset+count; i++ {
        dst[dstOffset+index] = src[srcOffset+index]
        index++
    }
    return true, nil
}

關于怎么在Golang對Array和Slice進行拷貝問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

辽宁省| 石柱| 龙岩市| 都昌县| 菏泽市| 珠海市| 东乡族自治县| 永清县| 琼结县| 得荣县| 五河县| 清流县| 宝清县| 澄江县| 茌平县| 德令哈市| 肇源县| 乐昌市| 崇信县| 睢宁县| 濮阳县| 萨嘎县| 九龙城区| 泗阳县| 建瓯市| 鹿邑县| 汶上县| 鲁甸县| 弥渡县| 和政县| 德钦县| 大邑县| 连州市| 宁德市| 奈曼旗| 南皮县| 无极县| 北碚区| 金坛市| 昆明市| 虹口区|