🗣 Wd提问: go获取本地ip
🤖 Ai回答: 在 Go 语言中获取本地 IP 地址有多种方法,以下是几种常用的实现方式:
方法一:获取默认网卡的 IP
go
package main
import (
fmt
net
)
func getLocalIP() (string, error) {
addrs, err := net.InterfaceAddrs()
if err != nil {
return , err
}
for _, addr := range addrs {
if ipnet, ok := addr.(*net.IPNet); ok {
// 过滤掉回环地址和 IPv6 地址
if !ipnet.IP.IsLoopback() && ipnet.IP.To4() != nil {
return ipnet.IP.String(), nil
}
}
}
return , fmt.Errorf(no local IP found)
}
func main() {
ip, err := getLocalIP()
if err != nil {
fmt.Printf(Error: %v\n, err)
return
}
fmt.Printf(Local IP: %s\n, ip)
}
方法二:获取指定网卡的 IP
go
package main
import (
fmt
net
)
func getSpecificInterfaceIP(interfaceName string) (string, error) {
iface, err := net.InterfaceByName(interfaceName)
if err != nil {
return , err
}
addrs, err := iface.Addrs()
if err != nil {
return , err
}
for _, addr := range addrs {
if ipnet, ok := addr.(*net.IPNet); ok {
if ipnet.IP.To4() != nil {
return ipnet.IP.String(), nil
}
}
}
return , fmt.Errorf(no IPv4 address found on interface %s, interfaceName)
}
func main() {
// 获取 eth0 网卡的 IP
ip, err := getSpecificInterfaceIP(eth0)
if err != nil {
fmt.Printf(Error: %v\n, err)
return
}
fmt.Printf(Interface eth0 IP: %s\n, ip)
}
方法三:获取所有非回环的 IPv4 地址
go
package main
import (
fmt
net
)
func getAllLocalIPv4() ([]string, error) {
var ips []string
interfaces, err := net.Interfaces()
if err != nil {
return nil, err
}
for _, iface := range interfaces {
// 跳过 down 状态和回环接口
if !iface.IsUp() iface.Flags&net.FlagLoopback != 0 {
continue
}
addrs, err := iface.Addrs()
if err != nil {
continue
}
for _, addr := range addrs {
if ipnet, ok := addr.(*net.IPNet); ok {
if ipnet.IP.To4() != nil {
ips = append(ips, ipnet.IP.String())
}
}
}
}
return ips, nil
}
func main() {
ips, err := getAllLocalIPv4()
if err != nil {
fmt.Printf(Error: %v\n, err)
return
}
fmt.Println(All local IPv4 addresses:)
for _, ip := range ips {
fmt.Printf(%s\n, ip)
}
}
方法四:通过连接外部服务器获取出口 IP
go
package main
import (
fmt
net
)
func getExternalIP() (string, error) {
conn, err := net.Dial(udp, 8.8.8.8:53)
if err != nil {
return , err
}
defer conn.Close()
localAddr := conn.LocalAddr().(*net.UDPAddr)
return localAddr.IP.String(), nil
}
func main() {
ip, err := getExternalIP()
if err != nil {
fmt.Printf(Error: %v\n, err)
return
}
fmt.Printf(External IP (local address): %s\n, ip)
}
方法五:更完整的 IP 获取函数
go
package main
import (
fmt
net
strings
)
func getLocalIPs() ([]string, error) {
var ips []string
// 获取所有网络接口
interfaces, err := net.Interfaces()
if err != nil {
return nil, err
}
for _, iface := range interfaces {
// 跳过不活跃的接口和回环接口
if !iface.IsUp() iface.Flags&net.FlagLoopback != 0 {
continue
}
// 获取接口的地址列表
addrs, err := iface.Addrs()
if err != nil {
continue
}
for _, addr := range addrs {
switch v := addr.(type) {
case *net.IPNet:
ip := v.IP.To4()
if ip != nil {
// 过滤掉私有地址范围(可选)
if !isPrivateIP(ip.String()) {
ips = append(ips, ip.String())
}
}
case *net.IPAddr:
ip := v.IP.To4()
if ip != nil {
ips = append(ips, ip.String())
}
}
}
}
return ips, nil
}
// 判断是否为私有 IP 地址
func isPrivateIP(ip string) bool {
if strings.HasPrefix(ip, 10.)
strings.HasPrefix(ip, 172.16.)
strings.HasPrefix(ip, 172.17.)
strings.HasPrefix(ip, 172.18.)
strings.HasPrefix(ip, 172.19.)
strings.HasPrefix(ip, 172.20.)
strings.HasPrefix(ip, 172.21.)
strings.HasPrefix(ip, 172.22.)
strings.HasPrefix(ip, 172.23.)
strings.HasPrefix(ip, 172.24.)
strings.HasPrefix(ip, 172.25.)
strings.HasPrefix(ip, 172.26.)
strings.HasPrefix(ip, 172.27.)
strings.HasPrefix(ip, 172.28.)
strings.HasPrefix(ip, 172.29.)
strings.HasPrefix(ip, 172.30.)
strings.HasPrefix(ip, 172.31.)
strings.HasPrefix(ip, 192.168.) {
return true
}
return false
}
func main() {
ips, err := getLocalIPs()
if err != nil {
fmt.Printf(Error: %v\n, err)
return
}
fmt.Println(Local IP addresses:)
for _, ip := range ips {
fmt.Printf(%s\n, ip)
}
}
使用建议
1、方法一 最常用,适合大多数场景
2、方法二 当你需要特定网卡的 IP 时使用
3、方法三 需要获取所有可用的本地 IP 时使用
4、方法四 获取实际的出口 IP(通过 UDP 连接)
5、方法五 功能最完整,包含私有 IP 过滤等
选择哪种方法取决于你的具体需求。通常情况下,方法一是最实用的选择。
📣 商家广告 :
👍
0
👎
IP地址: 120.10.202.215
搜索次数: 0
提问时间: 2025-11-03 09:58:38
🛒 域名购买 :
te.biz ww.fj.cn chemen.com.cn 2.bj.cn wc.chat 93.gold lansou.cn 70.gs 32.cx e-j.com.cn
❓️ 热门提问 :
forge服务器搭建 com域名注册机构 网上服务器租赁 Stack Overflow 济南域名注册 棉花云服务器 ip卡通形象 云计算100强 出售自己的域名 全球vps交流 豌豆Ai站群搜索引擎系统
🌐 域名评估 :
3q.sh.cn CDs.com.cn qhug.cn xphone.center evfair.org.cn sharktech.net aa.yn.cn 4qd.cn iveh.cn drone.nx.cn
⛏ 最新挖掘 :
凯里酸汤鱼 贵阳烤脑花 都匀毛尖茶 花溪牛肉粉 贵阳烤生蚝 贵阳烤豆腐 贵阳纸包鱼 贵阳特色菜
🖌 热门作画 :
🤝 关于我们:
豌豆Ai
域名
建站
站群
留痕
推广
评估
源码
开发Ai
工具
日记
价格
加盟
广告
流量
留言
联系
🗨 加入群聊 :
🔗 友情链接 :
软件开发平台
站群谷歌seo
ai提问
🧰 站长工具 :Ai工具 whois查询 搜索
📢 温馨提示 :本站所有问答由Ai自动创作,内容仅供参考,若有误差请用“联系”里面信息通知我们人工修改或删除。
👉 技术支持 :本站由豌豆Ai 提供技术支持,使用的最新版:《豌豆Ai站群搜索引擎系统 V.25.10.25》搭建本站。