验证IP地址 Golang

集合划分问题 Golang 动态规划 01背包
最长等差数列问题 Golang 暴力法
字母组合 Golangweb

验证IP地址 Golang

正则表达式解比我这个更好。正则表达式

package main
 
import (
    "fmt"
    "strconv"
    "strings"
)

func main()  {
    s:=""
    fmt.Scan(&s)
    //含.多是ipv4
    if strings.Contains(s,"."){//ipv4
        if strings.Contains(s,".."){
            fmt.Println("Neither")
            return
        }
        nums:=strings.Split(s,".")
        for _,num:=range nums{
        	//不是0,可是以0开头
            if string(num[0])=="0"&&num!="0"{
                fmt.Println("Neither")
                return
            }
            //解析为整数
            n,err:=strconv.Atoi(num)
            //没法解析的非法值
            if err!=nil{
                fmt.Println("Neither")
                return
            }
            //范围限制
            if n<0||n>255{
                fmt.Println("Neither")
                return
            }
        }
        fmt.Println("IPv4")
    //含:多是ipv4
    }else if strings.Contains(s,":"){//ipv6
        if strings.Contains(s,"::"){
            fmt.Println("Neither")
            return
        }
        nums:=strings.Split(s,":")
        for _,num:=range nums{
            //以00开头
            if string(num[0])=="0"&& len(num)>1 &&string(num[1])=="0"{
                fmt.Println("Neither")
                return
            }
            //解析为16进制整数
            n,err:=strconv.ParseInt(num,16,64)
            //没法解析的非法值
            if err!=nil{
                fmt.Println("Neither")
                return
            }
            //范围限制
            if n<0||n>16*16*16*16-1{
                fmt.Println("Neither")
                return
            }
        }
        fmt.Println("IPv6")
    }else{
        fmt.Println("Neither")
    }
}