s := "42"
num, err := strconv.Atoi(s) // num будет типа int
if err != nil {
// обработка ошибки
}
Особенности:
int
s := "42"
num, err := strconv.ParseInt(s, 10, 64) // 10 - основание, 64 - битность
if err != nil {
// обработка ошибки
}
result := int(num) // явное приведение к int
var num int
_, err := fmt.Sscanf("42", "%d", &num)
s := "42"
num := int(s) // Ошибка компиляции: cannot convert s (type string) to type int
Причина: В Go нет прямого приведения между строковыми и числовыми типами.
num := 42
s := strconv.Itoa(num) // "42"
num := 42
s := strconv.FormatInt(int64(num), 10) // 10 - основание системы
num := 42
s := fmt.Sprintf("%d", num) // "42"
sHex := fmt.Sprintf("%x", num) // "2a" (шестнадцатеричное)
num := 65
s := string(num) // "A" (код Unicode), а не "65"
Причина: string(int)
интерпретирует число как код Unicode, а не преобразует цифры.
Все методы преобразования строки в число могут вернуть ошибку:
s := "42x"
_, err := strconv.Atoi(s)
if err != nil {
if e, ok := err.(*strconv.NumError); ok {
fmt.Printf("Ошибка в '%s': %v\n", e.Num, e.Err)
}
}
Бенчмарк для 100,000 преобразований: | |
---|---|
Метод | Время |
strconv.Atoi | 15ms |
strconv.ParseInt | 18ms |
fmt.Sscanf | 120ms |
strconv.Itoa | 12ms |
fmt.Sprintf | 45ms |
s := "1010"
num, _ := strconv.ParseInt(s, 2, 64) // двоичная, 10
num := 42
s := fmt.Sprintf("%04d", num) // "0042"
bigNum := int64(1<<60)
s := strconv.FormatInt(bigNum, 10)
strconv.Atoi
или strconv.ParseInt
strconv.Itoa
или strconv.FormatInt
int(string)
и string(int)
не работает как ожидаетсяfmt.Sprintf
strconv
Правила выбора:
Atoi
/Itoa
ParseInt
/FormatInt
fmt.Sprintf
fmt
методов