如何在Go中获取本地IP地址?

时间:2014-05-09 07:00:08

标签: go

我想获得计算机的IP地址。我使用了下面的代码,但它返回127.0.0.1

我想获取IP地址,例如10.32.10.111,而不是环回地址。

name, err := os.Hostname()
if err != nil {
     fmt.Printf("Oops: %v\n", err)
     return
}

addrs, err := net.LookupHost(name)
if err != nil {
    fmt.Printf("Oops: %v\n", err)
    return
}

for _, a := range addrs {
    fmt.Println(a)
}  

8 个答案:

答案 0 :(得分:77)

您需要遍历所有网络接口

ifaces, err := net.Interfaces()
// handle err
for _, i := range ifaces {
    addrs, err := i.Addrs()
    // handle err
    for _, addr := range addrs {
        var ip net.IP
        switch v := addr.(type) {
        case *net.IPNet:
                ip = v.IP
        case *net.IPAddr:
                ip = v.IP
        }
        // process IP address
    }
}

Play(摘自util / helper.go)

答案 1 :(得分:75)

当机器上存在多个ip接口时,这是一个更好的解决方案来检索首选的出站IP地址。

import (
    "log"
    "net"
    "strings"
)

// Get preferred outbound ip of this machine
func GetOutboundIP() net.IP {
    conn, err := net.Dial("udp", "8.8.8.8:80")
    if err != nil {
        log.Fatal(err)
    }
    defer conn.Close()

    localAddr := conn.LocalAddr().(*net.UDPAddr)

    return localAddr.IP
}

答案 2 :(得分:26)

net.LookupHost()上的{p> os.Hostname()可能总是会给你127.0.0.1,因为这是/etc/hosts中的内容或同等内容。

我认为你想要使用的是net.InterfaceAddrs()

  

func InterfaceAddrs() ([]Addr, error)

     

InterfaceAddrs返回系统的网络接口地址列表。

答案 3 :(得分:23)

为了确保获得非环回地址,只需在迭代时检查IP是否不是环回。

// GetLocalIP returns the non loopback local IP of the host
func GetLocalIP() string {
    addrs, err := net.InterfaceAddrs()
    if err != nil {
        return ""
    }
    for _, address := range addrs {
        // check the address type and if it is not a loopback the display it
        if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
            if ipnet.IP.To4() != nil {
                return ipnet.IP.String()
            }
        }
    }
    return ""
}

答案 4 :(得分:6)

这对我有用:

host, _ := os.Hostname()
addrs, _ := net.LookupIP(host)
for _, addr := range addrs {
    if ipv4 := addr.To4(); ipv4 != nil {
        fmt.Println("IPv4: ", ipv4)
    }   
}

与海报的例子不同,它只返回非环回地址,例如10.120.X.X。

答案 5 :(得分:2)

func resolveHostIp() (string) {

    netInterfaceAddresses, err := net.InterfaceAddrs()

    if err != nil { return "" }

    for _, netInterfaceAddress := range netInterfaceAddresses {

        networkIp, ok := netInterfaceAddress.(*net.IPNet)

        if ok && !networkIp.IP.IsLoopback() && networkIp.IP.To4() != nil {

            ip := networkIp.IP.String()

            fmt.Println("Resolved Host IP: " + ip)

            return ip
        }
    }
    return ""
}

答案 6 :(得分:0)

func GetInternalIP() string {
    itf, _ := net.InterfaceByName("enp1s0") //here your interface
    item, _ := itf.Addrs()
    var ip net.IP
    for _, addr := range item {
        switch v := addr.(type) {
        case *net.IPNet:
            if !v.IP.IsLoopback() {
                if v.IP.To4() != nil {//Verify if IP is IPV4
                    ip = v.IP
                }
            }
        }
    }
    if ip != nil {
        return ip.String()
    } else {
        return ""
    }
}

答案 7 :(得分:0)

如果除127.0.0.1之外只有一个IP地址,则可以在此处查看代码。

conn,err := net.Dial("ip:icmp","google.com")
fmt.Println(conn.LocalAddr())

第二个参数可以是除127.0.0.1之外的任何IP地址