如何检索当前机器的地址?

时间:2014-04-08 07:36:26

标签: go

以下内容获取本地IP地址:

package main

import (
    "fmt"
    "net"
)

func main() {
    a, _ := net.LookupHost("localhost")
    fmt.Printf("Addresses: %#+v\n",a)
}

这是通常如何获取本地IP地址,根据需要手动过滤切片?

4 个答案:

答案 0 :(得分:3)

以下是对原始posted by Russ Cox to the golang-nuts google group的代码段进行快速而肮脏的修改:

package main

import (
  "fmt" 
  "net" 
  "os"  
)

func main() {
  tt, err := net.Interfaces()
  if err != nil { 
    panic(err)  
  }     
  for _, t := range tt {
    aa, err := t.Addrs()
    if err != nil {
      panic(err)        
    }           
    for _, a := range aa {
      ipnet, ok := a.(*net.IPNet) 
      if !ok {          
        continue                
      }                 
      v4 := ipnet.IP.To4() 
      if v4 == nil || v4[0] == 127 { // loopback address
        continue                
      }                 
      fmt.Printf("%v\n", v4)
    }           
    os.Exit(0)  
  }     
  os.Exit(1)

}

答案 1 :(得分:1)

我有一个补充:上面显示的当前解决方案至少在FreeBSD 10上不起作用,因为系统将地址作为CIDR表示法返回,例如192.168.1.2/32!因此,有必要稍微改变一下解决方案:

package main

import (
    "fmt"
    "net"
    "os"
    "strings"
)

func main() {
    addrs, err := net.InterfaceAddrs()
    if err != nil {
        fmt.Println("Error: " + err.Error())
        os.Exit(1)
    }

    for _, a := range addrs {
        text := a.String()

        if strings.Contains(text, `/`) {
            text = text[:strings.Index(text, `/`)]
        }

        ip := net.ParseIP(text)
        if !ip.IsLoopback() && !ip.IsUnspecified() {
            fmt.Println(ip)
        }
    }
}

部分......

if strings.Contains(text, `/`) {
    text = text[:strings.Index(text, `/`)]
}

...检测是否是地址的一部分并删除此部分!

致以最诚挚的问候,

和Thorsten

答案 2 :(得分:0)

这些微小的修改对我有用:

package main

import (
    "fmt"
    "net"
    "os"
)

func myip() {
    os.Stdout.WriteString("myip:\n")

    addrs, err := net.InterfaceAddrs()
    if err != nil {
        fmt.Errorf("error: %v\n", err.Error())
        return
    }

    for _, a := range addrs {
        ip := net.ParseIP(a.String())
        fmt.Printf("addr: %v loopback=%v\n", a, ip.IsLoopback())
    }

    fmt.Println()
}

func myip2() {
    os.Stdout.WriteString("myip2:\n")

    tt, err := net.Interfaces()
    if err != nil {
        fmt.Errorf("error: %v\n", err.Error())
        return
    }
    for _, t := range tt {
        aa, err := t.Addrs()
        if err != nil {
            fmt.Errorf("error: %v\n", err.Error())
            continue
        }
        for _, a := range aa {
            ip := net.ParseIP(a.String())
            fmt.Printf("%v addr: %v loopback=%v\n", t.Name, a, ip.IsLoopback())
        }
    }

    fmt.Println()
}

func main() {
    fmt.Println("myip -- begin")
    myip()
    myip2()
    fmt.Println("myip -- end")
}

答案 3 :(得分:0)

找到正确的IP地址可能是个问题,因为典型的服务器和开发机器可能有多个接口。例如,我的Mac上的$ifconfig会返回以下接口lo0, gif0, stf0, en0, en1, en2, bridge0, p2p0, vmnet1, vmnet8, tap0, fw0, en4

基本上,您需要了解您的环境。

它不漂亮,但是对于它的价值,这就是我在生产Ubuntu服务器上使用的东西。它也适用于我的开发Mac 10.9.2,它知道它在Windows上的作用。

package main

import (
    "net"
    "strings"
)

func findIPAddress() string {
    if interfaces, err := net.Interfaces(); err == nil {
        for _, interfac := range interfaces {
            if interfac.HardwareAddr.String() != "" {
                if strings.Index(interfac.Name, "en") == 0 ||
                    strings.Index(interfac.Name, "eth") == 0 {
                    if addrs, err := interfac.Addrs(); err == nil {
                        for _, addr := range addrs {
                            if addr.Network() == "ip+net" {
                                pr := strings.Split(addr.String(), "/")
                                if len(pr) == 2 && len(strings.Split(pr[0], ".")) == 4 {
                                    return pr[0]
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    return ""
}

func main() {
    println(findIPAddress())
}