Encontrando o comprimento de uma string

Go:
Encontrando o comprimento de uma string

Como Fazer:

Em Go, strings são tratadas como sequências imutáveis de bytes. Você pode encontrar o comprimento de uma string usando a função embutida len(), que retorna o número de bytes, não necessariamente o número de caracteres. Veja como usá-la:

package main

import (
	"fmt"
	"unicode/utf8"
)

func main() {
	// Usando len() para encontrar o comprimento em bytes
	str := "Hello, 世界"
	byteLength := len(str)
	fmt.Println("Comprimento em Bytes:", byteLength) // Saída: Comprimento em Bytes: 13

	// Para obter com precisão o número de caracteres ou runas numa string
	runeLength := utf8.RuneCountInString(str)
	fmt.Println("Comprimento em Runas:", runeLength) // Saída: Comprimento em Runas: 9
}

O primeiro método usando len() pode não sempre fornecer o resultado esperado, uma vez que conta bytes. Para strings contendo caracteres não ASCII (como “世界”), deve-se usar RuneCountInString do pacote unicode/utf8 para contar pontos de código Unicode de forma precisa.

Aprofundamento

Antes do Go 1, não havia uma demarcação estrita para o tratamento de strings como sequências de bytes versus sequências de caracteres. Após o Go 1, a adoção do UTF-8 como esquema de codificação padrão para strings tornou necessárias abordagens mais claras. A função len() funciona perfeitamente para strings ASCII, onde os caracteres são representados em um único byte. No entanto, à medida que as aplicações Go se tornaram mais globais, e a necessidade de suportar uma miríade de idiomas e conjuntos de caracteres cresceu, a abordagem simplista de len() mostrou limitações.

A introdução e o uso de utf8.RuneCountInString() respondem a essas limitações fornecendo uma maneira de contar caracteres Unicode reais (runas na terminologia Go). Este método garante que o cálculo do comprimento seja independente das especificidades de codificação do UTF-8, onde os caracteres podem abranger vários bytes.

Uma abordagem alternativa para atravessar e manipular strings, mais alinhada com o ethos de concorrência e eficiência do Go, pode envolver o tratamento de strings como fatias de runas. No entanto, esse método necessita de uma etapa de conversão e não resolve instantaneamente todas as complexidades do Unicode (por exemplo, caracteres combinados).

Em resumo, enquanto len() é adequado para o comprimento em bytes e é eficiente para texto ASCII, utf8.RuneCountInString() é uma escolha mais confiável para uma aplicação compatível globalmente. Ainda assim, incentiva-se que os desenvolvedores entendam os compromissos em desempenho e uso de memória que essas escolhas implicam.