字节序:大端序、小端序
大端序:低地址端存放高位字节
小端序:低地址端存放低位字节
大端序,网段指定首末ip
import "net"
func main () {
ip, cidr, _ := net.ParseCIDR("10.1.0.0/16")
// 10.1.0.0
fmt.Println(ip)
Prefix := cidr.IP.String()
// 10.1.0.0
fmt.Println(Prefix)
m, _ := cidr.Mask.Size()
//int 16
fmt.Println(m)
//将mask转换成ip格式,255.255.0.0
fmt.Println(net.IP(cidr.Mask).To4())
//ffff0000(32bit,f=1111) 转换255.255.0.0 掩码
fmt.Println(cidr.Mask)
//10.1.0.0 加上100变成10.1.0.100,如果加上300,满255就会向前进位
first = firstIP(cidr, 100)
last = lastIP(cidr)
}
func firstIP(cidr net.IP, num int) string {
//len(cidr.IP.To4())的长度是4
ip := make(net.IP, len(cidr.IP.To4()))
//10.1.0.0
fmt.Println(cidr.IP.To4())
// 0.0.0.0
fmt.Println(ip)
//这里只接受cidr.IP.To4()ip类型,转为Uint32类型,| num等于+num,最大保位255,如果超过255,向前进一位变成10.1.1.0
first:= binary.BigEndian.Uint32(cidr.IP.To4()) | num
// ip初始化时为0.0.0.0,将first的值赋给ip
binary.BigEndian.PutUint32(ip,first)
return ip.String()
}
func lastIP(cidr net.IP) string {
//反序,变成ffff 65535 : 0.0.255.255
last:= ^binary.BigEndian.Uint32(net.IP(cidr.Mask).To4())
// 将last的值赋给ip,10.1.255.255
binary.BigEndian.PutUint32(ip,last)
}
获取本机IP
import "net"
func GetHostIp() (net.IP, error) {
addrs, err := net.InterfaceAddrs()
if err != nil {
return nil, err
}
//此时addrs包含ipv4和ipv6的地址
fmt.Println(addrs)
for _, a := range addrs {
if ipnet, ok := a.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
if ipnet.IP.To4() != nil {
return ipnet.IP, nil
}
}
}
return nil, errors.New("no valid ipv4 address founded")
}