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.

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;lenda sus elementos.s = append(s, x): guarde siempre lo que devuelve.s[a:b]va deaab-1;[:b]y[a:]abrevian.make([]T, len, cap)reserva sitio;caplo 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.