В Go строковые символьные значения представляют собой символы Unicode, закодированные в UTF-8.UTF-8 - это кодировка переменной длины, которая использует от одного до четырех байтов на символ.
Например:
package main
import (
"fmt"
"unicode/utf8"
)
func is10Hyphen(s string) bool {
for n := 1; len(s) > 0; n++ {
r, size := utf8.DecodeRuneInString(s)
if r == utf8.RuneError && (size == 0 || size == 1) {
return false
}
if n == 10 {
return r == '-'
}
s = s[size:]
}
return false
}
func main() {
s := "absoloute-power"
fmt.Println(is10Hyphen(s))
s = "absoloute+power"
fmt.Println(is10Hyphen(s))
s = "absoloute"
fmt.Println(is10Hyphen(s))
}
Playground: https://play.golang.org/p/h9rMQWWAdvb
Вывод:
true
false
false
Если вы готовы рассмотреть возможность встретить заменяющий символ Unicode как ошибку, то для вашего примера:
func is10Hyphen(s string) bool {
n := 0
for _, r := range s {
if r == utf8.RuneError {
return false
}
n++
if n == 10 {
return r == '-'
}
}
return false
}
Детская площадка: https://play.golang.org/p/SHbPAnldTyw