In the following code, I iterate over a string
rune by rune, but I'll actually need an int
to perform some checksum calculation. Do I really need to encode the rune
into a []byte
, then convert it to a string
and then use Atoi
to get an int
out of the rune
? Is this the idiomatic way to do it?
// The string `s` only contains digits.
var factor int
for i, c := range s[:12] {
if i % 2 == 0 {
factor = 1
} else {
factor = 3
}
buf := make([]byte, 1)
_ = utf8.EncodeRune(buf, c)
value, _ := strconv.Atoi(string(buf))
sum += value * factor
}
On the playground: http://play.golang.org/p/noWDYjn5rJ
The problem is simpler than it looks. You convert a
rune
value to anint
value withint(r)
. But your code implies you want the integer value out of the ASCII (or UTF-8) representation of the digit, which you can trivially get withr - '0'
as arune
, orint(r - '0')
as anint
. Be aware that out-of-range runes will corrupt that logic.