Я пытаюсь преобразовать строку, возвращенную с flag.Arg(n), в int. Каков идиоматический способ сделать это в Go?
Преобразовать строку в целочисленный тип в Go?
Ответ 1
Например,
package main
import (
    "flag"
    "fmt"
    "os"
    "strconv"
)
func main() {
    flag.Parse()
    s := flag.Arg(0)
    // string to int
    i, err := strconv.Atoi(s)
    if err != nil {
        // handle error
        fmt.Println(err)
        os.Exit(2)
    }
    fmt.Println(s, i)
}
Ответ 2
Преобразование простых строк
 Самый простой способ - использовать  strconv.Atoi().
 Обратите внимание, что есть много других способов. Например,  fmt.Sscan() и  strconv.ParseInt() которые дают большую гибкость, так как вы можете, например, указать основание и битовый размер. Также, как отмечено в документации strconv.Atoi():
Atoi эквивалентен ParseInt (s, 10, 0), преобразованному в тип int.
Вот пример использования упомянутых функций (попробуйте на Go Playground):
flag.Parse()
s := flag.Arg(0)
if i, err := strconv.Atoi(s); err == nil {
    fmt.Printf("i=%d, type: %T\n", i, i)
}
if i, err := strconv.ParseInt(s, 10, 64); err == nil {
    fmt.Printf("i=%d, type: %T\n", i, i)
}
var i int
if _, err := fmt.Sscan(s, &i); err == nil {
    fmt.Printf("i=%d, type: %T\n", i, i)
}
 Вывод (если вызывается с аргументом "123"):
i=123, type: int
i=123, type: int64
i=123, type: int
Разбор пользовательских строк
 Существует также удобная  fmt.Sscanf() которая дает еще большую гибкость, поскольку с помощью строки формата вы можете указать числовой формат (например, ширину, основание и т.д.) Вместе с дополнительными дополнительными символами во входной string.
 Это отлично подходит для разбора пользовательских строк, содержащих число. Например, если ваш ввод предоставлен в форме "id:00123" где у вас есть префикс "id:" а число фиксировано 5 цифрами, дополненными нулями, если короче, это очень легко разбирается следующим образом:
s := "id:00123"
var i int
if _, err := fmt.Sscanf(s, "id:%5d", &i); err == nil {
    fmt.Println(i) // Outputs 123
}
Ответ 3
Вот три способа разбить строки на целые числа, от самого быстрого времени выполнения до самого медленного:
-   strconv.ParseInt(...)самый быстрый
-   strconv.Atoi(...)прежнему очень быстро
-   fmt.Sscanf(...)не очень быстрый, но самый гибкий
Вот тест, который показывает использование и пример времени для каждой функции:
package main
import "fmt"
import "strconv"
import "testing"
var num = 123456
var numstr = "123456"
func BenchmarkStrconvParseInt(b *testing.B) {
  num64 := int64(num)
  for i := 0; i < b.N; i++ {
    x, err := strconv.ParseInt(numstr, 10, 64)
    if x != num64 || err != nil {
      b.Error(err)
    }
  }
}
func BenchmarkAtoi(b *testing.B) {
  for i := 0; i < b.N; i++ {
    x, err := strconv.Atoi(numstr)
    if x != num || err != nil {
      b.Error(err)
    }
  }
}
func BenchmarkFmtSscan(b *testing.B) {
  for i := 0; i < b.N; i++ {
    var x int
    n, err := fmt.Sscanf(numstr, "%d", &x)
    if n != 1 || x != num || err != nil {
      b.Error(err)
    }
  }
}
 Вы можете запустить его, сохранив как atoi_test.go и запустив go test -bench=. atoi_test.go go test -bench=. atoi_test.go.
goos: darwin
goarch: amd64
BenchmarkStrconvParseInt-8      100000000           17.1 ns/op
BenchmarkAtoi-8                 100000000           19.4 ns/op
BenchmarkFmtSscan-8               2000000          693   ns/op
PASS
ok      command-line-arguments  5.797s
Ответ 4
Если вы управляете входными данными, вы можете использовать мини-версию
package main
import (
    "testing"
    "strconv"
)
func Atoi (s string) int {
    var (
        n uint64
        i int
        v byte
    )   
    for ; i < len(s); i++ {
        d := s[i]
        if '0' <= d && d <= '9' {
            v = d - '0'
        } else if 'a' <= d && d <= 'z' {
            v = d - 'a' + 10
        } else if 'A' <= d && d <= 'Z' {
            v = d - 'A' + 10
        } else {
            n = 0; break        
        }
        n *= uint64(10) 
        n += uint64(v)
    }
    return int(n)
}
func BenchmarkAtoi(b *testing.B) {
    for i := 0; i < b.N; i++ {
        in := Atoi("9999")
        _ = in
    }   
}
func BenchmarkStrconvAtoi(b *testing.B) {
    for i := 0; i < b.N; i++ {
        in, _ := strconv.Atoi("9999")
        _ = in
    }   
}
самый быстрый вариант (при необходимости напишите свой чек). Результат:
Path>go test -bench=. atoi_test.go
goos: windows
goarch: amd64
BenchmarkAtoi-2                 100000000               14.6 ns/op
BenchmarkStrconvAtoi-2          30000000                51.2 ns/op
PASS
ok      path     3.293s
Ответ 5
Попробуй это
import ("strconv")
value : = "123"
number,err := strconv.ParseUint(value, 10, 32)
