Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 在Go中将字符串转换为整数类型?_String_Go_Type Conversion - Fatal编程技术网

String 在Go中将字符串转换为整数类型?

String 在Go中将字符串转换为整数类型?,string,go,type-conversion,String,Go,Type Conversion,我正在尝试将从flag.Arg(n)返回的字符串转换为int。围棋中的惯用方法是什么?例如 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 { //

我正在尝试将从
flag.Arg(n)
返回的字符串转换为
int
。围棋中的惯用方法是什么?

例如

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)
}
转换简单字符串 最简单的方法是使用函数

请注意,还有许多其他方法。例如,它提供了更大的灵活性,例如,您可以指定基和位大小。也如
strconv.Atoi()的文档中所述:

Atoi相当于ParseInt(s,10,0),转换为int类型

下面是一个使用上述函数的示例(在上尝试):

输出(如果使用参数
调用“123”
):

解析自定义字符串 还有一个方便的方法,它提供了更大的灵活性,因为对于格式字符串,您可以指定数字格式(如宽度、基数等),并在输入
字符串中添加额外字符

这对于解析包含数字的自定义字符串非常有用。例如,如果您的输入是以
“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
}

以下是将字符串解析为整数的三种方法,从最快的运行时间到最慢的运行时间:

  • 最快的
  • 还是很快
  • 速度不太快,但最灵活
  • 下面是一个基准测试,它显示了每个函数的用法和示例计时:

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

    如果控制输入数据,则可以使用迷你版

    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
        }   
    }
    
    试试这个

    import ("strconv")
    
    value := "123"
    number,err := strconv.ParseUint(value, 10, 32)
    finalIntNum := int(number) //Convert uint64 To int
    

    或者只是做一个致命的操作,例如,
    panic(err)
    为什么要用不必要的东西使它复杂化,标志os和bs
    strconv
    同样可以解释为字符串转换,有任何意义(扩展)对于
    Atoi
    ,使其更易于记忆。
    ParseInt
    的第二个参数指定了什么?@kaushik94单击链接,您将立即看到:
    ParseInt(s string,base int,bitSize int)
    。因此它是基础:“ParseInt解释给定基础(2到36)中的字符串s”。请注意,strconv.ParseInt()的bitSize参数不会将字符串转换为您选择的类型,而是仅将结果限制为特定的“位”。另见:@viv是的,没错。如果需要类型为
    int
    的值并且使用了
    strconv.ParseInt()
    ,则需要手动类型转换(从
    int64
    int
    )。什么?真正地写“围棋”的人做得很容易。不要转动你的轮子:)那Atoi(“-9999”)呢?清楚而有用的答案。我在这里引用了你的话。
    strconv.Itoa(I)
    (int到ASCII)将int设置为字符串。看
    strconv.Atoi
    (ASCII到int)将字符串设置为int。请参阅。
    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
    
    import ("strconv")
    
    value := "123"
    number,err := strconv.ParseUint(value, 10, 32)
    finalIntNum := int(number) //Convert uint64 To int