Go presents strings as slices of bytes (chars). As long as it's ASCII, it's fine. However, when dealing with multi-byte UTF-8 characters (codepoints), the proper unit is the rune. So, before attempting to measure a string's length, or read its n-th character, one must remember and access the string as a slice of runes.
s := "naïve"
// bad
fmt.Println(len(s)) // 6
fmt.Println(string(s[2])) // Ã
// good
r := []rune(s)
fmt.Println(len(r)) // 5
fmt.Println(string(r[2])) // ï