您的位置:

Golang获取本机IP

一、Golang获取本机网关

在Golang中获取本机网关一般通过获取本机网络接口信息以及网络路由信息来实现。可以使用net包中的接口函数和路由函数实现。

    
package main

import (
    "fmt"
    "net"
)

func main() {
    ifaces, err := net.Interfaces()
    if err != nil {
        panic(err)
    }
    for _, iface := range ifaces {
        if iface.Flags&net.FlagUp != 0 && iface.Flags&net.FlagLoopback == 0 {
            addrs, err := iface.Addrs()
            if err != nil {
                panic(err)
            }
            for _, addr := range addrs {
                switch v := addr.(type) {
                case *net.IPNet:
                    if !v.IP.IsLoopback() && v.IP.To4() != nil {
                        gateway := getGateway(v)
                        fmt.Println("Gateway:", gateway)
                        return
                    }
                }
            }
        }
    }
}

func getGateway(ipNet *net.IPNet) net.IP {
    r, err := netlink.RouteGet(ipNet.IP)
    if err != nil {
        panic(err)
    }
    for _, rt := range r {
        if rt.Dst == nil {
            return rt.Gw
        }
    }
    panic("no route")
}
    

上述代码中通过遍历本地网络接口信息,找到可用于外网接入的接口,并获取其对应IP地址,然后通过linux中获取网络路由信息的netlink库查询对应网关,得到本地网关信息。

二、Golang获取本机出口IP

在Golang中获取本机出口IP比较简单,可以直接使用net包中的函数实现。

    
package main

import (
    "fmt"
    "net"
)

func main() {
    conn, err := net.Dial("udp", "baidu.com:80")
    if err != nil {
        panic(err)
    }
    defer conn.Close()

    fmt.Println(conn.LocalAddr().(*net.UDPAddr).IP)
}
    

上述代码实现方式是通过连接外部网络,然后获取连接本地地址信息来实现获取本机出口IP的。

三、Go获取本机IP

获取本机IP相对比较容易,可以通过net包中的函数获取。

    
package main

import (
    "fmt"
    "net"
)

func main() {
    addrs, err := net.InterfaceAddrs()
    if err != nil {
        panic(err)
    }
    for _, addr := range addrs {
        switch v := addr.(type) {
        case *net.IPNet:
            if !v.IP.IsLoopback() && v.IP.To4() != nil {
                fmt.Println("IP:", v.IP)
            }
        }
    }
}
    

上述代码中通过遍历本地网络接口信息获取可用的外网接入接口,并获取其对应IP地址,最终实现获取本机IP地址的目的。

四、Golang获取IP地址

Golang获取IP地址需要借助net包中的IP地址相关函数来实现,下面是一个获取外网IP的实例:

    
package main

import (
    "encoding/json"
    "io/ioutil"
    "log"
    "net/http"
    "regexp"
)

const (
    url = "https://ipinfo.io/json"
)

type IpInfo struct {
    IP string `json:"ip"`
}

func main() {
    resp, err := http.Get(url)
    if err != nil {
        log.Fatalln(err)
    }

    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        log.Fatalln(err)
    }

    var ipInfo = new(IpInfo)
    if err := json.Unmarshal(body, ipInfo); err != nil {
        log.Fatalln(err)
    }

    re := regexp.MustCompile(`[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+`)
    match := re.FindAllString(string(body), 1)
    if len(match) > 0 {
        fmt.Println("IP:", match[0])
    } else {
        fmt.Println("IP:", ipInfo.IP)
    }
}
    

上述代码中借助了外部的IP地址查询接口,将取得的响应结果进行解析,获取出其中的IP地址信息。

五、Golang获取硬盘序列号

Golang获取硬盘序列号需要用到windows下的wmi库,下面是一个获取硬盘序列号的实例:

    
package main

import (
    "fmt"
    "github.com/StackExchange/wmi"
)

type win32PhysicalMedia struct {
    Tag                string
    SerialNumber       string
    RemovableMedia     bool
    MediaType          string
    CreationClassName  string
    Manufacturer       string
    Model              string
    Name               string
    Description        string
    Version            string
    PartNumber         string
    OtherIdentifyingInfo string
}

func GetPhysicalMediaSerial() {
    var dst []win32PhysicalMedia
    query := "SELECT Tag, SerialNumber, MediaType FROM Win32_PhysicalMedia"
    err := wmi.Query(query, &dst)
    if err != nil {
        panic(err)
    }

    for _, item := range dst {
        fmt.Println("Serial:", item.SerialNumber)
    }
}
    

上述代码会查询到本机中所有硬盘的序列号信息,并输出到控制台。

六、Golang获取时间

Golang获取时间可以借助time包中函数实现,下面是一个获取当前时间的实例:

    
package main

import (
    "fmt"
    "time"
)

func main() {
    now := time.Now()
    fmt.Println("Time:", now)
}
    

上述代码中通过time包中获取当前时间对象,将其输出到控制台实现了获取系统当前时间的功能。

七、Golang获取当前路径

Golang获取当前路径可以借助os包中的函数实现,下面是一个获取当前路径的实例:

    
package main

import (
    "fmt"
    "os"
)

func main() {
    wd, err := os.Getwd()
    if err != nil {
        panic(err)
    }
    fmt.Println("Curr dir:", wd)
}
    

上述代码通过os包中的Getwd函数获取当前程序执行的路径,将其输出到控制台即可实现获取程序当前路径的功能。

八、Golang获取时间戳

Golang获取时间戳可以借助time包中函数实现,下面是一个获取当前时间戳的实例:

    
package main

import (
    "fmt"
    "time"
)

func main() {
    now := time.Now().Unix()
    fmt.Println("Timestamp:", now)
}
    

上述代码中通过time.Now()获取当前时间对象,并使用其Unix()方法得到其对应的时间戳,将其输出到控制台即可实现获取当前时间戳的功能。

九、Golang获取环境变量

Golang获取环境变量可以借助os包中的函数实现,下面是一个获取GOPATH环境变量的实例:

    
package main

import (
    "fmt"
    "os"
)

func main() {
    fmt.Println("GOPATH:", os.Getenv("GOPATH"))
}
    

上述代码中通过os包中的Getenv函数获取GOPATH环境变量,将其输出到控制台实现了获取环境变量的功能。

十、Golang获取文件大小

Golang获取文件大小可以借助os包中的函数实现,下面是一个获取指定文件大小的实例:

    
package main

import (
    "fmt"
    "os"
)

func main() {
    file, err := os.Open("test.txt")
    if err != nil {
        panic(err)
    }
    defer file.Close()

    fi, err := file.Stat()
    if err != nil {
        panic(err)
    }

    fmt.Println("File size:", fi.Size())
}
    

上述代码中通过os包中的Open函数打开指定文件,然后使用Stat函数获取文件信息,最终输出文件大小到控制台实现了获取文件大小的功能。