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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.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
从Go中的字符串解析多个整数?_Go - Fatal编程技术网

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

从Go中的字符串解析多个整数?,go,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)

对不起,这个标题,我不知道怎么说

我有一个关于这个代码的问题

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 
}
我想把ip地址转换成整数

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

首先从strconv.Atoi中检索编号,然后将其转换为int64


如何简化此操作?

此构造很重,但如果您(可能应该)捕获到解析错误,则它看起来更自然

话虽如此,这个确切问题的正确解决方案是使用现有的
net.ParseIP
函数来构建

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

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])
}
func ip2long(s字符串)(ret int64){
bip:=([]字节)(net.ParseIP.To4())

return(int64)(bip[0])*(1我不建议这样做,因为您将忽略错误,但您可以编写一个函数来给出第一个值:

func first(x int, _ error) int {return x;}
然后在代码中首先使用
(strconv.Atoi(p[0])

对于您列出的特定代码,我将使用(经过良好测试的!)标准库的net.ParseIP()和net.To4()函数:

// WARNING untested code!!

type InvalidIP string
func (InvalidIP ipStr) Error() string {
    return "Invalid IPv4 address: "+ipStr
}

func ip2long(ipStr string) (ret int64, err error) {
    var ip net.IP
    if ip = net.ParseIP(ipStr); ip == nil {
        return 0, InvalidIP(ip)
    }
    if ip = ip.To4(); ip == nil {
        return 0, InvalidIP(ip)
    }
    for b := range ip {
        ret <<= 8
        ret += b
    }
    return ret, nil
}
//警告未测试的代码!!
类型无效字符串
func(无效ipStr)错误()字符串{
返回“无效IPv4地址:+ipStr”
}
func ip2long(ipStr字符串)(ret int64,err error){
var ip net.ip
如果ip=net.ParseIP(ipStr);ip==nil{
返回0,无效(ip)
}
如果ip=ip.To4();ip==nil{
返回0,无效(ip)
}
对于b:=范围ip{

ret如果要解析字符串中的多个整数,请尝试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])
}
func main(){
变量ip[4]uint32
地址:=“192.168.0.1”
_,错误:=fmt.Sscanf(地址,“%d.%d.%d.%d”、&ip[0]、&ip[1]、&ip[2]、&ip[3])
如果错误!=零{
fmt.Println(错误)
返回
}
fmt.Println(ip)

fmt.Println(ip[0]Sscanf返回一个错误,在这里被忽略。正如其他答案强调了错误检查的重要性一样,最好在这里检查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])
}