从Go中的字符串中解析多个整数?

kra*_*ran 3 go

抱歉标题,我不知道怎么说

我对此代码有疑问

func ip2long(ip string) (ret int64) {
  p:= strings.Split(ip, ".")
  n, _:= strconv.Atoi(p[0])
  ret += int64(n)*16777216 
  n, _= strconv.Atoi(p[1])
  ret += int64(n)*65536 
  n, _= strconv.Atoi(p[2])
  ret += int64(n)*256
  n, _= strconv.Atoi(p[3])
  ret += int64(n)

  return 
}
Run Code Online (Sandbox Code Playgroud)

我想将IP地址转换为整数

你看我写了这么难看的代码

strconv.Atoi的第一个retrive数字然后将其转换为int64

如何简化这个?

and*_*olm 7

如果要从字符串中解析多个整数,请尝试使用Sscanf函数,如下所示:

func main() {
    var ip [4] uint32
    addr := "192.168.0.1"
    _, err := fmt.Sscanf(addr, "%d.%d.%d.%d", &ip[0], &ip[1], &ip[2], &ip[3])
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(ip)
    fmt.Println(ip[0]<<24 + ip[1]<<16 + ip[2]<<8 + ip[3])
}
Run Code Online (Sandbox Code Playgroud)


Den*_*ret 6

这个构造很重,但是如果你正如你可能应该捕获解析错误那么看起来更自然.

话虽这么说,对这个确切问题的正确解决方案是使用net.ParseIP构建IP的现有 功能

func ParseIP(s string) IP
Run Code Online (Sandbox Code Playgroud)

如果您必须保留当前的函数原型,我建议:

func ip2long(s string) (ret int64) {
    bip := ([]byte)(net.ParseIP(s).To4())
    return (int64)(bip[0]) * (1 << 24) + (int64)(bip[1]) * (1 << 16) + (int64)(bip[2]) * (1 << 8) + (int64)(bip[3])
}
Run Code Online (Sandbox Code Playgroud)

请注意,您可以在ParseIP的返回上添加测试(如果出错,则为nil)