Middle
Como são estruturadas as strings na linguagem de programação Go?
sobes.tech IA
Resposta da IA
Uma string em Go é uma sequência imutável de bytes.
Características principais:
- Imutabilidade: após a criação, a string não pode ser alterada.
- Representação: é armazenada como um ponteiro e um comprimento. O ponteiro aponta para o primeiro byte da sequência na memória. O comprimento é a quantidade de bytes.
- Codificação: as strings em Go não contêm informações sobre a codificação. São frequentemente usadas para armazenar UTF-8, mas podem conter quaisquer bytes.
- Iteração por bytes: o ciclo
for index, value range stringao iterar sobre uma string retorna o índice e a rune (int32), não o byte. - Iteração por runas: uma rune representa um ponto de código Unicode. Go usa UTF-8, portanto uma rune pode ocupar de 1 a 4 bytes.
- Obter uma substring: a operação de corte
string[start:end]cria uma nova string que aponta para a mesma seção de memória, mas com limites diferentes.
Exemplos:
// Declaração e inicialização
var s string
s = "Привет" // Literal de string em Go - sequência de bytes,
// geralmente interpretada como UTF-8
// Comprimento da string em bytes
byteLength := len(s) // 12, pois "П", "р", "и", "в", "е", "т" são caracteres multibyte em UTF-8
// Iteração por runas
runeCount := 0
for index, runeValue := range s {
// index - índice do início da rune em bytes
// runeValue - valor da rune (int32)
_ = index // Uso de um identificador anônimo _ para variável não utilizada
// fmt.Printf("Índice: %d, Rune: %c (U+%04X)\n", index, runeValue, runeValue)
runeCount++
}
// runeCount será 6
// Iteração por bytes
byteCount := 0
for i := 0; i < len(s); i++ {
// s[i] - byte no índice i
_ = s[i] // Uso de um identificador anônimo
// fmt.Printf("Byte no índice %d: %d\n", i, s[i])
byteCount++
}
// byteCount será 12
// Obter uma substring (corte de bytes)
// Importante: o corte de bytes pode quebrar uma rune multibyte
// sub := s[0:5] // Isto pode ser uma sequência UTF-8 inválida
// Uso de pacotes strings ou unicode/utf8 para trabalhar de forma segura com runas
Comparação com corte de bytes ([]byte):
| Característica | String | []byte |
|---|---|---|
| Mutabilidade | Não | Sim |
| Representação | Ponteiro + Comprimento | Ponteiro + Comprimento + Capacidade |
| Tipo | Primitivo embutido | Slice (fatia) |
| Uso | Texto imutável | Dados modificáveis (bytes) |
Conversão entre string e []byte:
// string -> []byte
byteSlice := []byte(s)
// []byte -> string
newString := string(byteSlice)