我想要得到计算机的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)
}
发布于 2014-05-09 15:05:20
您需要遍历所有网络接口
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)
发布于 2016-05-23 11:26:27
当机器上存在多个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
}
发布于 2015-07-22 07:13:32
要确保获得非环回地址,只需在迭代时检查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 ""
}
https://stackoverflow.com/questions/23558425
复制相似问题