From 792335a3cb0900832d1b48e0ae512acd9809d66b Mon Sep 17 00:00:00 2001 From: 4566704 <4566704@qq.com> Date: Sun, 20 Sep 2026 12:20:50 +0800 Subject: [PATCH] =?UTF-8?q?feat(netx):=20=E8=87=AA=20go-hua/common=20?= =?UTF-8?q?=E8=BF=81=E5=85=A5=E6=9C=AC=E6=9C=BA=E7=BD=91=E7=BB=9C=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=E5=B7=A5=E5=85=B7=E5=B9=B6=E7=8B=AC=E7=AB=8B=E6=88=90?= =?UTF-8?q?=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 枚举 IPv4 地址与 MAC 地址(过滤回环与虚拟网卡),附测试、例程与 README --- examples/netx/main.go | 16 ++++++++++++++++ netx/README.md | 21 +++++++++++++++++++++ netx/netx.go | 43 +++++++++++++++++++++++++++++++++++++++++++ netx/netx_test.go | 27 +++++++++++++++++++++++++++ 4 files changed, 107 insertions(+) create mode 100644 examples/netx/main.go create mode 100644 netx/README.md create mode 100644 netx/netx.go create mode 100644 netx/netx_test.go diff --git a/examples/netx/main.go b/examples/netx/main.go new file mode 100644 index 0000000..8691065 --- /dev/null +++ b/examples/netx/main.go @@ -0,0 +1,16 @@ +// netx 包示例:本机网络信息(IPv4 地址列表、MAC 地址列表) +package main + +import ( + "fmt" + + "git.zeroonesoft.cn/golib/zogo/netx" +) + +func main() { + ips, err := netx.GetLocalIp() + fmt.Println("本机 IPv4:", ips, "错误:", err) + + macs, err := netx.GetLocalMac() + fmt.Println("本机 MAC:", macs, "错误:", err) +} diff --git a/netx/README.md b/netx/README.md new file mode 100644 index 0000000..0ce5c62 --- /dev/null +++ b/netx/README.md @@ -0,0 +1,21 @@ +# netx + +本机网络信息:枚举 IPv4 地址(不含回环)与 MAC 地址(跳过无硬件地址的虚拟网卡)。 + +> 迁移自 go-hua/common(原 net.go)。 + +## 用法 + +```go +import "git.zeroonesoft.cn/golib/zogo/netx" + +ips, err := netx.GetLocalIp() // []string{"192.168.1.100", ...} +macs, err := netx.GetLocalMac() // []string{"aa-bb-cc-dd-ee-ff", ...} +``` + +完整可运行例程:[examples/netx/main.go](../examples/netx/main.go) + +## 注意 + +- 多网卡机器返回列表顺序即系统接口顺序,业务侧自行选择。 +- `NetBufferSize` 为历史遗留常量(0x1000),与本包函数无关联。 diff --git a/netx/netx.go b/netx/netx.go new file mode 100644 index 0000000..8d80502 --- /dev/null +++ b/netx/netx.go @@ -0,0 +1,43 @@ +// Package netx 本机网络信息:枚举 IPv4 地址与 MAC 地址(跳过回环与无硬件地址的虚拟网卡)。 +package netx + +import ( + "net" +) + +const NetBufferSize = 0x1000 + +// GetLocalIp 获取本机所有 IPv4 地址(不含回环) +func GetLocalIp() ([]string, error) { + addrList, err := net.InterfaceAddrs() + if err != nil { + return nil, err + } + ipList := make([]string, 0) + for _, address := range addrList { + // 检查ip地址判断是否回环地址 + if ipNet, ok := address.(*net.IPNet); ok && !ipNet.IP.IsLoopback() { + if ipNet.IP.To4() != nil { + ipList = append(ipList, ipNet.IP.String()) + } + } + } + return ipList, err +} + +// GetLocalMac 获取本机的MAC地址(跳过无硬件地址的虚拟网卡) +func GetLocalMac() ([]string, error) { + macList := make([]string, 0) + interfaces, err := net.Interfaces() + if err != nil { + return nil, err + } + for _, inter := range interfaces { + mac := inter.HardwareAddr.String() + if mac == "" { + continue + } + macList = append(macList, mac) + } + return macList, nil +} diff --git a/netx/netx_test.go b/netx/netx_test.go new file mode 100644 index 0000000..1c78297 --- /dev/null +++ b/netx/netx_test.go @@ -0,0 +1,27 @@ +package netx + +import "testing" + +func TestGetLocalIpAndMac(t *testing.T) { + ips, err := GetLocalIp() + if err != nil { + t.Fatalf("GetLocalIp: %v", err) + } + if len(ips) == 0 { + t.Log("本机无 IPv4 地址(CI 环境可能出现)") + } + + macs, err := GetLocalMac() + if err != nil { + t.Fatalf("GetLocalMac: %v", err) + } + if len(macs) == 0 { + t.Log("本机未采集到 MAC 地址(CI 环境可能出现)") + } + // 不应包含空串(无硬件地址的虚拟网卡已被过滤) + for _, m := range macs { + if m == "" { + t.Error("MAC 列表不应包含空串") + } + } +}