golang判断ip地址是ipv4还是ipv6

简介: golang判断ip地址是ipv4还是ipv6

公众号merlinsea


  • leetcode连接
  • 题目描述

640.png


  • 解题思路
  • 如果一个字符串是ipv4 则必须包含 . , 如果一个字符串是ipv6则必须包含 :, 因此可以将题目转换为判断是一个字符串是ipv4,以及判断一个字符串是ipv6两个部分。
  • 判断一个字符串是否是16进制可以使用如下方法进行判断,如果err为nil则标识这个字符串是一个正确的16进制,否则不是16进制
  • _,err := strconv.ParseInt(ip,16,64)
  • 判断一个字符串是否是十进制可以使用如下方式判断,如果err为nil则标识这个字符串是一个正确的十进制。
  • i,err := strconv.Atoi(ip)


func validIPAddress(queryIP string) string {
    if strings.Index(queryIP,".") >0 {
        // 验证是否是ipv4
        if isIpv4(queryIP){
            return "IPv4"
        }
        return "Neither"
    }
    if strings.Index(queryIP,":") > 0 {
        // 验证是否是ipv6
        if isIpv6(queryIP){
            return "IPv6"
        }
        return "Neither"
    }
    return "Neither"
}
func isIpv6(queryIP string) bool{
    var arr []string = strings.Split(queryIP,":")
    if len(arr)!=8 {
        return false
    }
    for i:=0;i<len(arr);i++ {
        if !ipv6Helper(arr[i]){
            return false
        }
    }
    return true
}
func ipv6Helper(ip string) bool{
    if len(ip)==0 || len(ip)>4{
        return false
    } 
    // 将16进制的ip转为int64看是否可以转 ,如果不能转,则返回err!=nil
    _,err := strconv.ParseInt(ip,16,64)
    return err == nil
}
func isIpv4(queryIP string) bool{
    var arr []string = strings.Split(queryIP,".")
    if len(arr)!=4 {
        return false
    }
    for i:=0;i<len(arr);i++  {
        if !ipv4Helper(arr[i]){
            return false
        }
    }
    return true
}
func ipv4Helper(ip string) bool{
    if len(ip)==0 || len(ip)>3 {
        return false
    }
    if ip[0]=='0' && len(ip)!=1{
        return false
    }
    // 将ip转为十进制的int
    i,err := strconv.Atoi(ip)
    if err != nil {
        return false
    }
    return i>=0 && i<=255
}


  • 题目描述
  • 买下所有产品的客户

640.png


  • 解题思路
  • 通过left join + where is not null 过滤出在product表中的数据
  • 通过group by + count(distinct(xxx)) 来过滤出所有商品


select c.customer_id
from customer c left join product p on c.product_key = p.product_key
where p.product_key is not null # 排除用户购买了一些不在product表中的商品
group by c.customer_id 
# 同一个用户可能买了一个商品多次,因此通过distinct去重
having count(distinct(p.product_key)) = (
    # 所有产品的数量
    select count(*)
    from product
)


  • 题目描述
  • 合作过至少三次的演员和导演
  • 解题思路
  • 按照演员id和导演id进行分组,多字段分组必须要所有字段一致才会分到同一组
select actor_id,director_id
from actordirector
group by actor_id,director_id
having count(*) >=3
  • 题目描述
  • 体育馆的人流量

640.png


  • 解题思路
  • 需要连续自增的三个id的时候,可以通过id = id-1,id=id-2进行leftjoin
  • union 具有去重功能, union all 不会进行去重
  • 当我们查询的时候需要一些中间表的时候,这个中间表必须要起一个别名
select *
from(
select s1.*
from stadium s1 left join stadium s2 on s1.id = s2.id-1
left join stadium s3 on s1.id = s3.id-2 # 这个from语句体现了连续的id
where s2.id is not null and s3.id is not null and s1.people>=100 and s2.people>=100 and s3.people>=100
union 
select s2.*
from stadium s1 left join stadium s2 on s1.id = s2.id-1
left join stadium s3 on s1.id = s3.id-2
where s2.id is not null and s3.id is not null and s1.people>=100 and s2.people>=100 and s3.people>=100
union
select s3.*
from stadium s1 left join stadium s2 on s1.id = s2.id-1
left join stadium s3 on s1.id = s3.id-2
where s2.id is not null and s3.id is not null and s1.people>=100 and s2.people>=100 and s3.people>=100
) tmp order by id


相关文章
|
4月前
|
应用服务中间件 Go nginx
[golang]获取本机IP
[golang]获取本机IP
|
7月前
|
Go
通过Golang获取公网IP地址
在Go语言中,获取当前的外网(公网)IP地址可以通过多种方法实现。其中一种常见的方法是通过访问外部服务来获取。这些服务可以返回访问者的公网IP地址,例如 httpbin.org/ip 或 ipify.org。下面是一个简单的例子,展示了如何使用Go标准库中的net/http包和io/ioutil包来实现这一功能。
通过Golang获取公网IP地址
|
7月前
|
Go Java C++
Golang每日一练(leetDay0031) 解码方法、复原 IP 地址
Golang每日一练(leetDay0031) 解码方法、复原 IP 地址
73 0
Golang每日一练(leetDay0031) 解码方法、复原 IP 地址
|
Go API 定位技术
使用Golang实现HTTP代理突破IP访问限制
使用Golang实现HTTP代理突破IP访问限制
|
网络协议 Go 数据库
golang是用GeoIP数据库解析IP到城市jsonRPC服务教程
RESTful接口 请求URL: https://api.turboes.com/Tbsapi/v1/ip2addr?ip=219.140.227.235 请求方式: GET 参数: 参数名 类型 说明 ip url-qurey-string 可选 要查询的ip地址,如果不传这表示当前.
4496 0
|
3月前
|
Go
Golang语言之管道channel快速入门篇
这篇文章是关于Go语言中管道(channel)的快速入门教程,涵盖了管道的基本使用、有缓冲和无缓冲管道的区别、管道的关闭、遍历、协程和管道的协同工作、单向通道的使用以及select多路复用的详细案例和解释。
129 4
Golang语言之管道channel快速入门篇
|
3月前
|
Go
Golang语言文件操作快速入门篇
这篇文章是关于Go语言文件操作快速入门的教程,涵盖了文件的读取、写入、复制操作以及使用标准库中的ioutil、bufio、os等包进行文件操作的详细案例。
71 4
Golang语言文件操作快速入门篇
|
3月前
|
Go
Golang语言之gRPC程序设计示例
这篇文章是关于Golang语言使用gRPC进行程序设计的详细教程,涵盖了RPC协议的介绍、gRPC环境的搭建、Protocol Buffers的使用、gRPC服务的编写和通信示例。
110 3
Golang语言之gRPC程序设计示例
|
3月前
|
安全 Go
Golang语言goroutine协程并发安全及锁机制
这篇文章是关于Go语言中多协程操作同一数据问题、互斥锁Mutex和读写互斥锁RWMutex的详细介绍及使用案例,涵盖了如何使用这些同步原语来解决并发访问共享资源时的数据安全问题。
100 4
|
3月前
|
Go 调度
Golang语言goroutine协程篇
这篇文章是关于Go语言goroutine协程的详细教程,涵盖了并发编程的常见术语、goroutine的创建和调度、使用sync.WaitGroup控制协程退出以及如何通过GOMAXPROCS设置程序并发时占用的CPU逻辑核心数。
69 4
Golang语言goroutine协程篇