网上搜了很多go语言查找本地可用ip4,基本就是这一套
func main(){
addrs, err := net.InterfaceAddrs()
if err != nil{
fmt.Println(err) return
}
for _, value := range addrs{
if ipnet, ok := value.(*net.IPNet); ok && !ipnet.IP.IsLoopback(){
if ipnet.IP.To4() != nil{
fmt.Println(ipnet.IP.String())
}
}
}
}
我发现这样既不准确而且逻辑性很差,我之前写过QT获取本地IP的方式,发现只有一种最靠谱,通过cmd的ipconfig方式,本地有用的ip是会有默认网关,只要拿得到默认网关,那么该ip就是当前机器正在使用的ip,代码如下:
func LocalIp() string{
var finalIp string
cmd := exec.Command("cmd","/c","ipconfig")
if out, err := cmd.StdoutPipe(); err != nil {
fmt.Println(err)
}else{
defer out.Close()
if err := cmd.Start(); err != nil {
fmt.Println(err)
}
if opBytes, err := ioutil.ReadAll(out); err != nil {
log.Fatal(err)
} else {
str:= string(opBytes)
var strs = strings.Split(str,"\r\n")
if 0 != len(strs){
var havingFinalIp4 bool = false
var cnt int = 0
for index,value := range strs{
vidx := strings.Index(value,"IPv4")
//说明已经找到该ip
if vidx != -1{
ip4lines := strings.Split(value,":")
if len(ip4lines) == 2{
cnt = index
havingFinalIp4 = true
ip4str := ip4lines[1]
finalIp = strings.TrimSpace(ip4str)
}
}
if havingFinalIp4 && index == cnt +2{
lindex := strings.Index(value,":")
if -1 != lindex{
lines := strings.Split(value,":")
if len(lines) == 2{
fip := lines[1]
if strings.TrimSpace(fip) != ""{
break
}
}
}
havingFinalIp4 = false
finalIp = ""
}
}
}
}
}
return finalIp
}