English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Golang 基础教程

Golang 控制语句

Golang 函数 & 方法

Golang 结构体

Golang 切片 & 数组

Golang 字符串(String)

Golang 指针

Golang 接口

Golang 并发

Golang 异常(Error)

Golang 其他杂项

Go 语言切片复制

切片是相似类型的存储元素,则不允许不同类型的元素的存储在同一条带的可变长度序列。在切片中,您可以使用Go语言提供的copy()函数将一个切片复制到另一个切片中。换句话说,通过copy()函数可以将一个切片的元素复制到另一切片中。

语法:

func copy(dst, src []Type) int

此处,dst表示目标切片,而src表示源切片。它将返回要复制的元素数量,该数量应len(dst)len(src)最小值。让我们借助给定的示例演示如何使用:

package main
import "fmt"
func main() {
    //创建切片
    slc1 := []int{58, 69, 40, 45, 11, 56, 67, 21, 65}
    var slc2 []int
    slc3 := make([]int, 5)
    slc4 := []int{78, 50, 67, 77}
    //复制之前
    fmt.Println("Slice_1:", slc1)
    fmt.Println("Slice_2:", slc2)
    fmt.Println("Slice_3:", slc3)
    fmt.Println("Slice_4:", slc4)
    //Copia della slice
    copy_1 := copy(slc2, slc1)
    fmt.Println("\nSlice:", slc2)
    fmt.Println("Numero totale di elementi copiati:", copy_1)
    copy_2 := copy(slc3, slc1)
    fmt.Println("\nSlice:", slc3)
    fmt.Println("Numero totale di elementi copiati:", copy_2)
    copy_3 := copy(slc4, slc1)
    fmt.Println("\nSlice:", slc4)
    fmt.Println("Numero totale di elementi copiati:", copy_3)
    // non si confonda, perché nell'esempio sopra
    // le righe di codice che copiano slc4
    // e quindi effettua una modifica permanente, ovvero
    // slc 4 contiene [58 69 40 45]
    copy_4 := copy(slc1, slc4)
    fmt.Println("\nSlice:", slc1)
    fmt.Println("Numero totale di elementi copiati:", copy_4)
}

Output:

Slice_1: [58 69 40 45 11 56 67 21 65]
Slice_2: []
Slice_3: [0 0 0 0 0]
Slice_4: [78 50 67 77]
Slice: []
Numero totale di elementi copiati: 0
Slice: [58 69 40 45 11]
Numero totale di elementi copiati: 5
Slice: [58 69 40 45]
Numero totale di elementi copiati: 4
Slice: [58 69 40 45 11 56 67 21 65]
Numero totale di elementi copiati: 4

Spiegazione dell'uso:Nell'esempio sopra, abbiamo quattro slice di tipo intero e eseguiamo operazioni di copia su di esse:

  • copy 1 := copy(slc2, slc1): qui, slc2 è la slice di destinazione, slc1 è la slice sorgente. In questo caso, quando proviamo a copiare la slice slc1 nella slice slc2, se slc2 è una slice nil, il metodo copy restituirà la lunghezza minima tra la slice sorgente e la slice di destinazione, per la slice nil slc2, la lunghezza minima è 0.

  • copy_2 := copy(slc3, slc1): qui, slc3 è la slice di destinazione e slc1 è la slice sorgente. In questo caso, lo slc3 è una slice vuota, quindi quando proviamo a utilizzare la funzione copy() per copiare la slice slc1 in slc3, poiché la lunghezza della slice è 5, copia solo 5 elementi dalla slice slc1, poiché la lunghezza della slice è 5, quindi può 不存储大于5的元素。

  • non memorizza elementi superiori a 5.copy_3 := copy(slc4,slc1):slc4quiè la slice sorgente. Quando proviamo a utilizzare la funzione copy() per copiareè la slice di destinazione, mentreè la slice sorgente. Quando proviamo a utilizzare la funzione copy() per copiare slice copiata inslc4 Quando si copia una slice, essa copia solo 4 elementi a partire dall'indice 0. Poichéslc4 La lunghezza della slice è 4, quindi non può memorizzare elementi superiori a 4.

  • copy_4 := copy(slc1,slc4):In questo caso, potrebbe essere confuso. Vedi, la slc4 è stata aggiornata nelle righe di codice superiori. Pertanto, ora consideriamo il valore aggiornato di slc4. Ora slc4 ha 4 elementi, mentre slc1 ha 9 elementi. Pertanto, il numero totale di elementi da copiare è 4.

Esempio 2:

package main 
  
import "fmt"
  
func main() { 
  
    //Slice sorgente
    slice_1 := []string{"w3codeboxs", "for", "w3codeboxs", "GFG"} 
  
    //Creazione della slice di destinazione, utilizzando la funzione make
    slice_2 := make([]string, 3) 
  
    //Prima della copia
    fmt.Println("Slice_1: ", slice_1) 
    fmt.Println("Slice_2: ", slice_2) 
  
    //Copia di slice_1 in slice_2
    Copy_1 := copy(slice_2, slice_1) 
    fmt.Println("\nSlice_1: ", slice_1) 
    fmt.Println("Slice_2: ", slice_2) 
    fmt.Println("Elementi copiati: ", Copy_1) 
  
        //Copia della slice
        //Utilizzo della funzione di copia
        //Vedere chiaramente il codice
    Copy_2 := copy(slice_1, []string{"123w3codeboxs", "gfg"}) 
    fmt.Println("\nSlice_1 : ", slice_1) 
    fmt.Println("Elementi copiati:", Copy_2)   
}

Output:

Slice_1:  [w3codeboxs for w3codeboxs GFG]
Slice_2:  [  ]
Slice_1:  [w3codeboxs for w3codeboxs GFG]
Slice_2:  [w3codeboxs for w3codeboxs]
Elementi copiati:  3
Slice_1:  [123w3codeboxs gfg w3codeboxs GFG]
Numero degli Elementi Copiati: 2