Идиоматический способ использования strconv.ParseInt с int
В итоге я пишу такой код. Мне нужен обычный int (для вызова некоторых других функций), но parseInt выдает только 64-битные числа:
i64, err := strconv.ParseInt(s, 10, 0)
if err != nil {
fmt.Println("parsing failed for", s)
}
i := int(i64)
http://play.golang.org/p/_efRm7yp3o
Есть ли способ избежать дополнительного броска? Или способ сделать это более идиоматичным?
2 ответа
Решение
Ты можешь использовать strconv.Atoi
который оборачивает strconv.ParseInt
так, как вы хотите.
Использовать bitSize parameter
из strconv.ParseInt
package main
import (
"fmt"
"strconv"
)
// 32 or 64 depending on platform
const IntBits = 1 << (^uint(0)>>32&1 + ^uint(0)>>16&1 + ^uint(0)>>8&1 + 3)
func printInt(i int) {
fmt.Println(i)
}
func main() {
s := "-123123112323231231"
i64, err := strconv.ParseInt(s, 10, IntBits)
if err != nil {
fmt.Println("parsing failed for ", s)
}
i := int(i64)
printInt(i)
i64, err = strconv.ParseInt(s, 10, 32)
if err != nil {
fmt.Println("parsing failed for ", s)
}
i = int(i64)
printInt(i)
}
Выход
-123123112323231231
parsing failed for -123123112323231231
-2147483648