欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Golang 拷貝Array或Slice的操作

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

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

1. 拷貝array

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

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

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

請看示例:

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]

我們稍作解釋:

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

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

2. 拷貝slice

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

func copy(dst, src []Type) int

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

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

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

總結(jié)為拷貝兩者最小長度元素: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. 總結(jié)

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

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

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

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

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

go語言中實現(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("目標緩沖區(qū) 索引超出范圍")
    }
    index := 0
    for i := srcOffset; i < srcOffset+count; i++ {
        dst[dstOffset+index] = src[srcOffset+index]
        index++
    }
    return true, nil
}

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

相關(guān)文章

  • Go語言簡介和環(huán)境配置

    Go語言簡介和環(huán)境配置

    Go語言保證了既能到達靜態(tài)編譯語言的安全和性能,又達到了動態(tài)語言開發(fā)速度和易維護性,有人形容Go語言:Go=?C?+?Python?,?說明Go語言既有C靜態(tài)語言程序的運行速度,又能達到Python動態(tài)語言的快速開發(fā),這篇文章主要介紹了Go介紹和環(huán)境配置,需要的朋友可以參考下
    2022-07-07
  • Go語言使用讀寫OPC詳解

    Go語言使用讀寫OPC詳解

    這篇文章主要介紹了Go語言使用讀寫OPC詳解,圖文講解的很清晰,有感興趣的同學(xué)可以學(xué)習(xí)下
    2021-03-03
  • 使用Go語言進行安卓開發(fā)的詳細教程

    使用Go語言進行安卓開發(fā)的詳細教程

    本文將介紹如何使用Go語言進行安卓開發(fā),我們將探討使用Go語言進行安卓開發(fā)的優(yōu)點、準備工作、基本概念和示例代碼,通過本文的學(xué)習(xí),你將了解如何使用Go語言構(gòu)建高效的安卓應(yīng)用程序,需要的朋友可以參考下
    2023-11-11
  • Golang設(shè)計模式之外觀模式的實現(xiàn)

    Golang設(shè)計模式之外觀模式的實現(xiàn)

    這篇文章主要介紹了Golang設(shè)計模式之外觀模式的實現(xiàn),外觀模式是一種常用的設(shè)計模式之一,是一種結(jié)構(gòu)型設(shè)計模式,它提供了一個簡單的接口來訪問復(fù)雜系統(tǒng)的各種功能,從而降低了系統(tǒng)的復(fù)雜度,需要詳細了解可以參考下文
    2023-05-05
  • Go語言刪除文本文件中的指定行操作代碼

    Go語言刪除文本文件中的指定行操作代碼

    假設(shè)現(xiàn)在有一個文本文件,我們需要刪除文件中亂碼的行。我們可以使用go的os庫來處理文件,遍歷整個文件然后將除過亂碼的行寫入一個新文件,以此來實現(xiàn)我們的需求,這篇文章主要介紹了Go語言刪除文本文件中的指定行,需要的朋友可以參考下
    2023-12-12
  • golang實現(xiàn)命令行程序的使用幫助功能

    golang實現(xiàn)命令行程序的使用幫助功能

    這篇文章介紹了golang實現(xiàn)命令行程序使用幫助的方法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • go語言在請求http時加入自定義http header的方法

    go語言在請求http時加入自定義http header的方法

    這篇文章主要介紹了go語言在請求http時加入自定義http header的方法,實例分析了Go語言http請求的原理與操作技巧,需要的朋友可以參考下
    2015-03-03
  • golang使用iconv報undefined:XXX的問題處理方案

    golang使用iconv報undefined:XXX的問題處理方案

    這篇文章主要介紹了golang使用iconv報undefined:XXX的問題處理方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • gtoken替換jwt實現(xiàn)sso登錄的問題小結(jié)

    gtoken替換jwt實現(xiàn)sso登錄的問題小結(jié)

    這篇文章主要介紹了gtoken替換jwt實現(xiàn)sso登錄,主要介紹了替換jwt的原因分析及gtoken的優(yōu)勢,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • 淺談golang二進制bit位的常用操作

    淺談golang二進制bit位的常用操作

    這篇文章主要介紹了淺談golang二進制bit位的常用操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12

最新評論