Преобразовать руну в int?

В следующем коде я перебираю руну string по руне, но мне действительно понадобится int для выполнения вычисления контрольной суммы. Мне действительно нужно кодировать rune в []byte, а затем преобразовать его в string, а затем использовать Atoi, чтобы получить int из rune? Это идиоматический способ сделать это?

// 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
}

На детской площадке: http://play.golang.org/p/noWDYjn5rJ

Ответы

Ответ 1

Проблема проще, чем выглядит. Вы преобразуете значение rune в значение int с помощью int(r). Но ваш код означает, что вы хотите получить целочисленное значение из представления цифры ASCII (или UTF-8), которое вы можете тривиально получить с помощью r - '0' как rune или int(r - '0') как int. Имейте в виду, что руны вне диапазона могут испортить эту логику.

Ответ 2

Например, sum += (int(c) - '0') * factor,

package main

import (
    "fmt"
    "strconv"
    "unicode/utf8"
)

func main() {
    s := "9780486653556"
    var factor, sum1, sum2 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))
        sum1 += value * factor
        sum2 += (int(c) - '0') * factor
    }
    fmt.Println(sum1, sum2)
}

Вывод:

124 124