DMarlon Studio

Lección 10 · 10 de 20

Slices · Go

Trabaje con slices en Go, las listas que crecen: append, len, cap, make y cortes s[a:b] que comparten memoria con el original.

Go · Slices en DMarlon Studio: el código del ejemplo y su salida en la terminal

Un slice es como un array sin longitud fija: []string{...} se escribe sin número entre los corchetes. Es la lista más usada en Go, y len(playlist) dice cuántos elementos tiene: 3.

append añade uno o varios elementos al final y devuelve el slice resultante, que hay que volver a guardar: playlist = append(playlist, ...). Si no se asigna, el cambio se pierde.

playlist[desde:hasta] toma un corte: desde la posición desde hasta la anterior a hasta. Si falta el primero, empieza en 0 ([:2]); si falta el segundo, llega al final ([2:]). [1:4] da los elementos 1, 2 y 3.

Por dentro, un slice usa un array con sitio de reserva: su capacidad, cap. make([]int, 0, 4) crea un slice vacío con sitio para 4. Mientras cabe, append aprovecha ese hueco; con el quinto elemento ya no cabe, y Go crea un array mayor (aquí de 8) y copia los datos.

Un corte no es una copia: comparte memoria con el original. Al cambiar firstTwo[0] cambia también playlist[0], que pasa a ser Overture. Si necesita una copia independiente, use copy o añada los elementos a un slice nuevo.

Código · main.go

package mainimport "fmt"func main() {	// A slice is a list that can grow: [] without a length.	playlist := []string{"Intro", "Sunrise", "Rain"}	fmt.Println(playlist, "len:", len(playlist))	// append returns the new slice: assign it back.	playlist = append(playlist, "Harbour", "Night Drive")	fmt.Println(playlist, "len:", len(playlist))	// s[from:to] goes from 'from' up to, not including, 'to'.	fmt.Println("First two:", playlist[:2])	fmt.Println("From the third:", playlist[2:])	fmt.Println("Middle:", playlist[1:4])	// make creates an empty slice with room (cap) for 4.	ratings := make([]int, 0, 4)	for i := 1; i <= 6; i++ {		ratings = append(ratings, i*10)		fmt.Printf("len=%d cap=%d %v\n", len(ratings), cap(ratings), ratings)	}	// A sub-slice shares memory with the original.	firstTwo := playlist[:2]	firstTwo[0] = "Overture"	fmt.Println("Changed through the sub-slice:", playlist[0])}

Salida · go run main.go

[Intro Sunrise Rain] len: 3
[Intro Sunrise Rain Harbour Night Drive] len: 5
First two: [Intro Sunrise]
From the third: [Rain Harbour Night Drive]
Middle: [Sunrise Rain Harbour]
len=1 cap=4 [10]
len=2 cap=4 [10 20]
len=3 cap=4 [10 20 30]
len=4 cap=4 [10 20 30 40]
len=5 cap=8 [10 20 30 40 50]
len=6 cap=8 [10 20 30 40 50 60]
Changed through the sub-slice: Overture

Para recordar

  • []tipo{...} crea un slice; len da sus elementos.
  • s = append(s, x): guarde siempre lo que devuelve.
  • s[a:b] va de a a b-1; [:b] y [a:] abrevian.
  • make([]T, len, cap) reserva sitio; cap lo muestra.
  • Un corte comparte memoria con su slice.

Ejercicio

Cree un slice con las notas 7, 4, 9, 6 y añada 8 con append. Escriba las tres del medio con un corte y, luego, la suma de todas con un for clásico.