Runas, bytes y cadenas en Go
Una cadena es bytes; recorrerla con range produce runas, y no son lo mismo.
func runes(text string) (int, int, string) {
bytes := len(text)
chars := utf8.RuneCountInString(text)
var offsets []string
for index, char := range text {
offsets = append(offsets, fmt.Sprintf("%d:%c", index, char))
if len(offsets) == 3 {
break
}
}
asRunes := []rune(text)
reversed := make([]rune, len(asRunes))
for i, char := range asRunes {
reversed[len(asRunes)-1-i] = char
}
return bytes, chars, string(reversed) + strings.Join(offsets, ",")
}
Cómo funciona
lencuenta bytes;utf8.RuneCountInStringcuenta caracteres.- El range entrega el desplazamiento en bytes y la runa que hay ahí.
- Indexar una cadena da un byte, no un carácter.
Palabras clave y builtins usados aquí
appendbreakforfuncifintlenmakerangereturnrunestringvar
El intento, en números
- Líneas
- 20
- Caracteres a escribir
- 450
- Tokens
- 131
- Ritmo de tres estrellas
- 95 tpm
Al ritmo de tres estrellas de 95 tokens por minuto, este intento toma unos 83 segundos.
Paso 2 de 5 en Cadenas y formato; paso 26 de 30 en Fundamentos del lenguaje.