在网络编程中,获取本机IP是一项常见的操作,本文将使用Golang代码,从多个角度详解如何获取本机IP。

一、使用net包获取本机IP

在Golang中,我们可以使用net包中的功能来获取本机的IP地址。下面是相关示例代码:

package main

import (
    "fmt"
    "net"
)

func main() {
    addrs, err := net.InterfaceAddrs()
    if err != nil {
        panic(err)
    }
    for _, addr := range addrs {
        if ipnet, ok := addr.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
            if ipnet.IP.To4() != nil {
                fmt.Println(ipnet.IP.String())
            }
        }
    }
}

首先,我们通过调用net包中的InterfaceAddrs()函数来获取本机所有的IP地址。接着,遍历地址列表并判断是否为IPNet类型,如果是,再判断是否为回环地址,并且是IPv4地址,最后输出字符串类型的IP地址。

二、使用ifconfig命令获取IP

在Linux系统中,ifconfig命令可以用来查看网络接口的信息,我们也可以通过执行该命令来获取本机IP地址。

package main

import (
    "bytes"
    "os/exec"
)

func main() {
    cmd := exec.Command("ifconfig")
    var out bytes.Buffer
    cmd.Stdout = &out
    err := cmd.Run()
    if err != nil {
        panic(err)
    }
    fmt.Println(out.String())
}

这个程序将执行ifconfig命令,并将命令输出解析为字符串。然后我们可以使用字符串处理函数来从输出中提取IP地址。

三、使用HTTP Request获取IP

如果我们需要获取本机的外部IP地址,可以通过向特定网站发送HTTP请求来获取。下面是相关代码:

package main

import (
    "fmt"
    "io/ioutil"
    "net/http"
)

func main() {
    resp, err := http.Get("http://myexternalip.com/raw")
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        panic(err)
    }
    fmt.Println(string(body))
}

这个程序将访问myexternalip.com,该网站会返回请求者的外部IP地址,我们可以通过读取响应中的body来获取这个地址。

四、总结

本文从多个角度详细介绍了如何使用Golang代码获取本机IP地址。网络编程是Golang的一大特色,希望这篇文章能为使用Golang编写网络应用的开发者提供帮助。