miércoles, 31 de octubre de 2018

Arrays en Go: strings como arrays y extracción de elementos

Los strings o cadenas de texto son, internamente, arrays de caracteres, por lo que podemos extraer caracteres de la misma manera como extraemos datos de otros arrays.


Extracciones de datos de un array

Existen diversas formas de extraer datos de un array. La primera es la más sencilla: accediendo al elemento que se encuentra en el índice especificado entre corchetes.

array[n]

donde n es un número entre cero y longitud -1, y se refiere al índice del array.

Otra forma de extraer elementos de un array es mediante rangos, indicando una posición inicial y una posición final.

array[inicio:fin]

En esta especificación, la posición inicial está incluida en el rango, mientras que la posición final no está incluida, llegando hasta el elemento justamente anterior.

En un rango, si no se especifica la posición inicial, asume por defecto la primera posición (posición cero). Si no se especifica la posición final, asume por defecto la longitud del array. Si no se especifica ninguna de las dos, asume desde el inicio (posición 0) hasta el final (longitud total).

El siguiente ejemplo ilustra estos conceptos, tanto con un string como con un array de enteros.

package main

import "fmt"

func main() {
   var poblacion string = "Arroyomolinos"
   notas := [6]int{6, 7, 9, 8, 5, 3}

   fmt.Printf("poblacion: %v\n", poblacion)
   fmt.Printf("Longitud poblacion: %v\n", len(poblacion))
   fmt.Printf("Carácter 4: %v\n", string(poblacion[4]))
   fmt.Printf("poblacion[:6] %v\n", poblacion[:6])
   fmt.Printf("poblacion[2:6] %v\n", poblacion[2:6])
   fmt.Printf("poblacion[6:] %v\n", poblacion[6:])
   fmt.Printf("poblacion[:] %v\n", poblacion[:])
   fmt.Println("---")
   fmt.Printf("notas: %v\n", notas)
   fmt.Printf("Longitud notas: %v\n", len(notas))
   fmt.Printf("Capacidad notas: %v\n", cap(notas))
   fmt.Printf("notas[4]: %v\n", notas[4])
   fmt.Printf("notas[:3] %v\n", notas[:3])
   fmt.Printf("notas[2:4] %v\n", notas[2:4])
   fmt.Printf("notas[3:] %v\n", notas[3:])
   fmt.Printf("notas[:] %v\n", notas[:])
}

Es conveniente reseñar varias cosas sobre los strings:

  • Cuando se extrae un único elemento, este será un byte, es decir, un entero de 8 bits (valor entre 0 y 255). Este byte se corresponde al código ASCII del carácter extraído. Por dicho motivo, en el código forzamos a que dicho byte se convierta y se muestre como un string.
  • Cuando se extrae un rango del string, dicho rango es otro string con el rango de caracteres extraído
  • Puede aplicarse la función len() (longitud o tamaño), pero no la función cap() (capacidad).

El resultado será el siguiente:

$ go run array-string.go
poblacion: Arroyomolinos
Longitud poblacion: 13
Carácter 4: y
poblacion[:6] Arroyo
poblacion[2:6] royo
poblacion[6:] molinos
poblacion[:] Arroyomolinos
---
notas: [6 7 9 8 5 3]
Longitud notas: 6
Capacidad notas: 6
notas[4]: 5
notas[:3] [6 7 9]
notas[2:4] [9 8]
notas[3:] [8 5 3]
notas[:] [6 7 9 8 5 3]

No hay comentarios:

Publicar un comentario