В отличие от atoi (или strtod) в C strconv. Atoi в Go не выполняется, если строка содержит что-то еще, кроме числа, например, конечные нецифровые символы. Однако найти подстроки, которые являются целыми, просто. Например:
s := "123h456i777"
var start, end int // offsets into string of current run of digits
for start < len(s) {
// Find end of integer
idx := strings.IndexFunc(s[start:], func(r rune) bool { return r < '0' || r > '9' })
if idx == -1 {
end = len(s)
} else {
end = start + idx
}
if n, err := strconv.Atoi(s[start:end]); err != nil {
log.Fatalln("Atoi error:", err.Error())
} else {
fmt.Println(n) // *** use the integer
}
if idx == -1 {
break // end of integer is end of string
}
// Find start of next integer
idx = strings.IndexFunc(s[end:], func(r rune) bool { return r >= '0' && r <= '9' })
if idx == -1 {
break // no more digits found
}
start = end + idx
}
Обратите внимание, что это не обрабатывает -ve целых чисел (если это возможно), но это легко исправить.