En Go, las funciones integradas append, len y cap juegan un papel clave al trabajar con slices.
Ejemplo:
arr := []int{1,2,3} arr2 := append(arr, 4) // arr2 puede estar en el mismo o en un nuevo backing array, dependiendo de cap(arr)
Detalles:
¿Qué pasará si "cortas" un slice y agregas un elemento mediante append? ¿Afectará esto al array original?
Respuesta: Si cap lo permite, append escribirá el elemento "al final" del array original, y los cambios serán visibles a través de todos los slices que referencian el mismo array.
Ejemplo:
a := []int{1,2,3,4} b := a[:2] // [1 2], len=2, cap=4 b = append(b, 10) // a cambia: a -> [1, 2, 10, 4]
Historia
En el equipo se añadieron elementos a un slice hijo, y de repente se modificaron los datos en el array padre; esto causó descoordinación en la lógica de negocio y errores muy difíciles de depurar en la distribución de tareas entre los usuarios.
Historia
Al llamar a append nuevamente en un slice grande, se esperaba que el nuevo array siempre fuera asignado nuevamente, pero de hecho, varias partes del sistema continuaron trabajando con el mismo "backing array", provocando condiciones de carrera y corrupción de datos.
Historia
Un desarrollador asignó un slice de tamaño fijo con make, pero cometió un error y cambió los argumentos de lugar: make([]int, cap, len). Como resultado, la lógica orientada a la capacidad, inesperadamente, funcionaba sobre la longitud, lo que provocó pánico al salir fuera de los límites s[0:len].