条件
现有一堆IP,每个IP有对应的城市,给一个IP,查询到对应的城市
答案
package main
import (
"bytes"
"encoding/binary"
"net"
)
type IpRange struct {
Begin uint32
End uint32
City string
}
type IpData []*IpRange
func (id *IpData) Length() int {
return len(*id)
}
func ip2Long(ip string) uint32 {
var long uint32
binary.Read(bytes.NewBuffer(net.ParseIP(ip).To4()), binary.BigEndian, &long)
return long
}
func getCity(ip string, list IpData) string {
head, tail := 0, list.Length()-1
il := ip2Long(ip)
if il <= 0 {
return ""
}
for head <= tail {
mid := head + (tail-head)/2
ir := list[mid]
if ir.Begin <= il && ir.End >= il {
return ir.City
} else if ir.Begin > il {
tail = mid - 1
} else {
head = mid + 1
}
}
return ""
}