¿Cómo agregar una rebanada en Golang?

El segmento de lenguaje de Go es más poderoso, flexible y conveniente que una array y es una estructura de datos liviana. Un segmento es una secuencia de longitud variable que almacena elementos de un tipo similar, no está permitido almacenar diferentes tipos de elementos en el mismo segmento. Es como una array que tiene un valor de índice y una longitud, pero el tamaño del segmento cambia de tamaño, no tienen un tamaño fijo como una array.
Como ya sabemos, el segmento es dinámico, por lo que el nuevo elemento se puede agregar a un segmento con la ayuda de la función append(). Esta función agrega el nuevo elemento al final del segmento.

Sintaxis:

func append(s []T, x ...T) []T

Aquí, esta función toma s slice y x…T significa que esta función toma un número variable de argumentos para el parámetro x . Este tipo de función también se conoce como función variadica.

Si el segmento está respaldado por la array y los arreglos tienen una longitud fija, ¿cómo es posible que un segmento tenga una longitud dinámica?

Bueno, la respuesta es cuando los nuevos elementos se agregan al segmento, se crea una nueva array. Ahora, los elementos presentes en la array existente se copian en una nueva array y devuelven una nueva referencia de segmento a esta array (nueva array). Entonces, debido a esto, la capacidad del segmento será el doble de la capacidad anterior (como se muestra en el ejemplo 1). Pero si el segmento existente tiene suficiente capacidad para contener nuevos elementos, entonces no se crea una array nueva y los elementos se almacenan en la array subyacente existente (como se muestra en el ejemplo 2).

Ejemplo 1:

// Go program to illustrate the
// concept of appending slices.
package main
  
import (
    "fmt"
)
  
func main() {
  
    // Creating and initializing slice
    // Using shorthand declaration
    s1 := []int{234, 567, 7890, 1234, 234}
    s2 := []string{"Geeks", "For", "Geeks"}
  
    // Displaying slices with
    // their length and capacity
    fmt.Println("Slice_1: ", s1)
    fmt.Println("Length of Slice_1: ", len(s1))
    fmt.Println("Capacity of Slice_1: ", cap(s1))
    fmt.Println()
    fmt.Println("Slice_2: ", s2)
    fmt.Println("Length of Slice_2: ", len(s2))
    fmt.Println("Capacity of Slice_2: ", cap(s2))
  
    // Appending slices
    // Using append() function
    res1 := append(s1, 1000)
    res2 := append(s2, "GFG")
  
    // Displaying results
    fmt.Println()
    fmt.Println("New slice_1: ", res1)
    fmt.Println("New length of slice_1: ", len(res1))
    fmt.Println("New capacity of slice_1: ", cap(res1))
    fmt.Println()
    fmt.Println("New slice_2: ", res2)
    fmt.Println("New length of slice_2: ", len(res2))
    fmt.Println("New capacity of slice_2: ", cap(res2))
}

Producción:

Slice_1:  [234 567 7890 1234 234]
Length of Slice_1:  5
Capacity of Slice_1:  5

Slice_2:  [Geeks For Geeks]
Length of Slice_2:  3
Capacity of Slice_2:  3

New slice_1:  [234 567 7890 1234 234 1000]
New length of slice_1:  6
New capacity of slice_1:  12

New slice_2:  [Geeks For Geeks GFG]
New length of slice_2:  4
New capacity of slice_2:  6

Ejemplo 2:

// Go program to illustrate the
// concept of appending slices.
package main
  
import "fmt"
  
func main() {
  
    // Creating and initializing slice
    // Using make() function
    // Here 4 and 6 is the length
    // and capacity of the slice
    s1 := make([]int, 4, 6)
  
    // Copying the elements in the slice
    // Using copy() function
    copy(s1, []int{123, 456, 789, 977})
  
    // Displaying slice
    fmt.Println("Slice : ", s1)
    fmt.Println("Length: ", len(s1))
    fmt.Println("Capacity: ", cap(s1))
  
    // Appending slice
    // Using append() function
    s2 := append(s1, 3454, 678)
  
    // Displaying slice
    fmt.Println()
    fmt.Println("Slice : ", s2)
    fmt.Println("Length: ", len(s2))
    fmt.Println("Capacity: ", cap(s2))
  
}

Producción:

Slice :  [123 456 789 977]
Length:  4
Capacity:  6

Slice :  [123 456 789 977 3454 678]
Length:  6
Capacity:  6

Agregando a segmento nulo: Como sabemos, el tipo de segmento de valor cero es nulo y la capacidad y la longitud de dicho tipo de segmento es 0. Pero con la ayuda de la función de agregar, es posible agregar valores a segmento nulo.

Ejemplo:

// Go program to illustrate the
// concept of appending to nil slice.
package main
  
import "fmt"
  
func main() {
  
    // Creating nil slice
    var s1 []int
  
    // Displaying slice
    fmt.Println("Slice : ", s1)
    fmt.Println("Length: ", len(s1))
    fmt.Println("Capacity: ", cap(s1))
  
    // Appending to nil slice
    // Using append() function
    s2 := append(s1, 89, 45, 67, 23)
  
    // Displaying slice
    fmt.Println()
    fmt.Println("Slice : ", s2)
    fmt.Println("Length: ", len(s2))
    fmt.Println("Capacity: ", cap(s2))
  
}

Producción:

Slice :  []
Length:  0
Capacity:  0

Slice :  [89 45 67 23]
Length:  4
Capacity:  4

Anexar a otro segmento usando el operador…: Se le permite agregar un segmento a otro con la ayuda del operador ….

Ejemplo:

// Go program to illustrate the concept 
// of appending to another slice.
package main
  
import "fmt"
  
func main() {
  
    // Creating and initializing slice
    // Using shorthand declaration
    s1 := []int{234, 567, 7890, 1234, 234}
    s2 := []int{10, 100, 1000, 10000}
  
    // Displaying slices with their
    // length and capacity
    fmt.Println("Slice_1: ", s1)
    fmt.Println("Length of Slice_1: ", len(s1))
    fmt.Println("Capacity of Slice_1: ", cap(s1))
      
    fmt.Println()
      
    fmt.Println("Slice_2: ", s2)
    fmt.Println("Length of Slice_2: ", len(s2))
    fmt.Println("Capacity of Slice_2: ", cap(s2))
  
    // Appending to another slice
    // Using append() function
    res1 := append(s1, s2...)
  
    // Displaying result
    fmt.Println()
    fmt.Println("New slice_1: ", res1)
    fmt.Println("New length of slice_1: ", len(res1))
    fmt.Println("New capacity of slice_1: ", cap(res1))
  
}

Producción:

Slice_1:  [234 567 7890 1234 234]
Length of Slice_1:  5
Capacity of Slice_1:  5

Slice_2:  [10 100 1000 10000]
Length of Slice_2:  4
Capacity of Slice_2:  4

New slice_1:  [234 567 7890 1234 234 10 100 1000 10000]
New length of slice_1:  9
New capacity of slice_1:  12

Publicación traducida automáticamente

Artículo escrito por ankita_saini y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *