golang 获取本机IP

本文介绍了一种使用Go语言从Windows系统中获取本地计算机IPv4地址和默认网关的方法。通过调用系统的ipconfig命令并解析其输出,可以准确地识别出当前活动网络接口的IP地址。此外,还提供了一个跨平台的解决方案,适用于多种网络接口类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package main

import (
    "os/exec"
    "syscall"
    "regexp"
    "strings"
    "fmt"
    "golang.org/x/text/encoding/simplifiedchinese"
)

type Charset string

const (
    UTF8    = Charset("UTF-8")
    GB18030 = Charset("GB18030")
)
var strip string
func main(){
    ip()
}
func ip() string {

    if len(strip) <= 0{
        command := exec.Command("CMD", "/C", " ipconfig")
        command.SysProcAttr = &syscall.SysProcAttr{HideWindow:true}
        //stdout ,err:= command.Output()
        stdout, err := command.Output()
        if err != nil {
            fmt.Printf("utility : get ip error!")
        }

            cmdRe:=ConvertByte2String(stdout,"GB18030")
            parts:=strings.Split(cmdRe,"\r\n")
            total :=0
            num :=0
            var strip ,strgateway string
            for i,v := range parts{
                if strings.Contains(v, "IPv4 地址") {
                    reg := regexp.MustCompile(`\d+\.\d+\.\d+\.\d+`)
                    if len(reg.FindAllString(v, -1)) > 0{
                        strip =reg.FindAllString(v, -1)[0]
                        num = i
                        total = num + 2
                        
                    }
                }
                if strings.Contains(v, "默认网关") {
                    reg := regexp.MustCompile(`\d+\.\d+\.\d+\.\d+`)
                    if len(reg.FindAllString(v, -1)) > 0{
                        strgateway =reg.FindAllString(v, -1)[0]
                        fmt.Println("IPv4地址 is =",i,strip)
                        fmt.Println("默认网关 is =",i,total,strgateway) 
                    }
                }

            }
    }
    
    return strip
}

func ConvertByte2String(byte []byte, charset Charset) string {
    var str string
    switch charset {
    case GB18030:
        var decodeBytes,_=simplifiedchinese.GB18030.NewDecoder().Bytes(byte)
        str= string(decodeBytes)
    case UTF8:
        fallthrough
    default:
        str = string(byte)
    }
    return str
}

====================================================================================================

package main

import (
	"fmt"
	"net"
	"os"
)
func main() {
 ip()
}
func ip() {

	    netInterfaces, err := net.Interfaces()
        if err != nil {
            fmt.Println("net.Interfaces failed, err:", err.Error())
            return ""
        }
     
        for i := 0; i < len(netInterfaces); i++ {
            if (netInterfaces[i].Flags & net.FlagUp) != 0 {
                if (netInterfaces[i].Name == "本地连接") || (netInterfaces[i].Name == "WLAN") || (netInterfaces[i].Name == "以太网"){
                    addrs, _ := netInterfaces[i].Addrs()
     
                    for _, address := range addrs {
                        if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
                            if ipnet.IP.To4() != nil {
                                return  ipnet.IP.String()
                                
                            }
                        }
                    }
                }
            }
        }

    return ""

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值