【golang基础】net包:ipv4、ipv6、域名

本文介绍了如何在Go语言中判断字符串是否符合IP地址格式,涵盖了IPv4和IPv6的处理,并探讨了域名解析的相关内容。

判断输入的字符串是否符合ip格式

以下代码不仅可用于ipv6,也同样适用于ipv4。

package main

import (
     "net"
     "fmt"
)

func main() {
    //ipv4 := "12.56.30.88"
    ipv6 := "fe80::7526:a2ae:a0b8:946d"
    var p_ipv6 *string = &ipv6 //使用指针

    // ParseIP 这个方法 可以用来检查 ipv4/ipv6 地址是否正确,如果不正确,该方法返回 nil
    address := net.ParseIP(*p_ipv6)
    if address == nil {
        fmt.Println("ipv6地址格式不正确")
    }else {
        fmt.Println("正确的ipv6地址-String:", address.String()) //返回格式string
        fmt.Println("正确的ipv6地址-To4", address.To4())   //返回格式IP
        fmt.Println("正确的ipv6地址-To16", address.To16()) //返回格式IP
    }
}

运行结果:
正确的ipv6地址-String: fe80::7526:a2ae:a0b8:946d
正确的ipv6地址-To4 <nil>
正确的ipv6地址-To16 fe80::7526:a2ae:a0b8:946d

ipv4相关

package main

import (
     "net"
     "fmt"
)

const (
    EtherAddrLen = 6
    IPv4AddrLen  = 4
    IPv6AddrLen  = 16
)

type IPv4Address uint32

func IntIPv4ToString(ip uint32) string {
    return fmt.Sprintf("%d.%d.%d.%d",
        byte(ip), byte(ip>>8), byte(ip>>16), byte(ip>>24))
}

func BytesToIPv4(a byte, b byte, c byte, d byte) IPv4Address {
    return IPv4Address(d)<<24 | IPv4Address(c)<<16 | IPv4Address(b)<<8 | IPv4Address(a)
}

func IPv4ToBytes(v IPv4Address) [IPv4AddrLen]byte {
    return [IPv4AddrLen]uint8{byte(v), byte(v >> 8), byte(v >> 16), byte(v >> 24)}
}

func main() {
    //格式处理
    fmt.Println("bytes to unit32 IPv4:", BytesToIPv4(12, 56, 30, 88)) //输出:1478375436
    fmt.Println("unit32 IPv4 to bytes:", IPv4ToBytes(BytesToIPv4(12, 56, 30, 88)))
    fmt.Println("解析uint32的ip地址", IntIPv4ToString(1478375436))
    fmt.Println("ipv4地址", net.IPv4(127, 0, 1, 2)) //IP
}

运行结果:
bytes to unit32 IPv4: 1478375436
unit32 IPv4 to bytes: [12 56 30 88]
解析uint32的ip地址 12.56.30.88
ipv4地址 127.0.1.2

ipv6相关

const (
    IPv6AddrLen  = 16
)
type IPv6Address [IPv6AddrLen]uint8

func (addr IPv6Address) String() string {
    return fmt.Sprintf("[%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x]",
        addr[0], addr[1], addr[2], addr[3],
        addr[4], addr[5], addr[6], addr[7],
        addr[8], addr[9], addr[10], addr[11],
        addr[12], addr[13], addr[14], addr[15])
}

域名解析相关

package main

import (
     "net"
     "fmt"
)

func DomainNameToIP() {
    //域名
    domain := "www.baidu.com"
    ipAddr, err := net.ResolveIPAddr("ip", domain)
    if err != nil {
        fmt.Printf("Err: %s", err.Error())
        return
    }
    fmt.Printf("获取的IP:%s\n", ipAddr.String())
    fmt.Printf("IP: %s Network: %s Zone: %s\n", ipAddr.IP, ipAddr.Network(), ipAddr.Zone)

    // 百度,虽然只有一个域名,但实际上,他对应电信,网通,联通等又有多个IP地址
    ns, err := net.LookupHost(domain)
    if err != nil {
        fmt.Printf("Err: %s", err.Error())
        return
    }

    fmt.Printf("获取的多个服务器的IP:\n")
    for _, n := range ns {
        fmt.Printf("%s\n", n) // 打开百度的地址
    }
}

func main() {
    DomainNameToIP()
}

运行结果:
获取的IP:39.156.66.14
IP: 39.156.66.14 Network: ip Zone:
获取的多个服务器的IP:
39.156.66.14
39.156.66.18

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值