Avatar ·

Extração de substring em Go: como obter parte de uma string por índices?

Não use slicing de bytes para strings Unicode!

Olá! Comecei a estudar Go recentemente e me deparei com um problema ao trabalhar com strings. Em outras linguagens (como Python ou JavaScript), estou acostumado a fazer algo como str[1:4] para obter uma substring. Em Go, tentei uma sintaxe similar, mas não obtive o que esperava.

Aqui está meu código:

package main

import "fmt"

func main() {
    str := "Привет, мир!"
    sub := str[1:4]
    fmt.Println(sub) // Esperava: "рив", mas recebo algo estranho
}

Em vez de "рив", vejo alguns caracteres corrompidos. Li que Go usa UTF-8, mas não entendo como isso afeta a extração de substrings. Também tentei trabalhar com uma string ASCII:

str := "Hello, World!"
sub := str[1:4]
fmt.Println(sub) // Exibe "ell" — funciona!

Por que surgem problemas com o cirílico? Como extrair substrings corretamente de strings que contêm caracteres Unicode (letras russas, emojis, etc.)? Preciso de uma maneira confiável que funcione para qualquer string. Desde já, obrigado!