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函數獲取文件信息,最終輸出文件大小到控制台實現了獲取文件大小的功能。

原創文章,作者:KPGP,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/147394.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
KPGP的頭像KPGP
上一篇 2024-11-01 14:08
下一篇 2024-11-01 14:08

相關推薦

  • 使用Golang調用Python

    在現代軟體開發中,多種編程語言的協作是相當普遍的。其中一種使用場景是Golang調用Python,這使得在使用Python庫的同時,可以利用Golang的高性能和強大並發能力。這篇…

    編程 2025-04-29
  • Centos7配置靜態ip

    本文將詳細闡述如何在Centos7系統中配置靜態ip。 一、查看網路介面 在配置靜態ip之前,我們首先需要查看系統中的網路介面,以確定我們需要配置的網卡是哪一個。 ifconfig…

    編程 2025-04-29
  • 使用Golang創建黑色背景圖片的方法

    本文將從多個方面介紹使用Golang創建黑色背景圖片的方法。 一、安裝必要的代碼庫和工具 在開始創建黑色背景圖片之前,我們需要先安裝必要的代碼庫和工具: go get -u git…

    編程 2025-04-29
  • Python檢測IP連通

    Python是一門強大的編程語言,常用於網路開發、數據分析等領域。IP地址是網路通信的基礎,在網路通信中,有時需要檢測IP地址是否連通。下面將從多個方面介紹Python檢測IP連通…

    編程 2025-04-28
  • Treck TCP/IP Stack 輸入驗證錯誤漏洞CVE-2020-11901解析

    本文將對Treck TCP/IP Stack 輸入驗證錯誤漏洞CVE-2020-11901進行詳細解析,並提供相關代碼示例。 一、漏洞背景 Treck TCP/IP Stack是一…

    編程 2025-04-27
  • 詳解 IP 正則表達式

    一、IP 地址基礎知識 在講解 IP 的正則表達式前,我們先來了解一下 IP 地址的基礎知識。IP 是 Internet Protocol 的縮寫,用於標識網路中的設備。IP 地址…

    編程 2025-04-24
  • Mac查看IP地址命令的用法

    一、查看本機IP地址 在Mac系統中,我們可以使用ifconfig命令來查看本機IP地址。具體方法如下: ifconfig 執行以上命令後,會得到如下結果: en0: flags=…

    編程 2025-04-24
  • Golang中使用strings.Split函數進行字元串分割的方法

    一、Split函數的基本用法 字元串是編程中常見的數據類型,它們可以在程序中被處理、存儲和傳輸。在Go語言中,字元串也是一個基本的數據類型,而strings包提供了一些操作字元串的…

    編程 2025-04-23
  • Golang環境變數全面解析

    Golang是一門非常流行的開發語言,擁有高效的CGO、簡單易懂的語法、高並發能力等優點,然而它也需要使用環境變數來配置一些參數。在本篇文章中,我們將從多個方面對Golang環境變…

    編程 2025-04-23
  • 深入下探golang http server

    Go語言已經成為了軟體開發領域的熱門語言,它的高性能、應用廣泛、安全性好,使得它成為了眾多開發者心目中的首選編程語言。在眾多應用場景中,golang http server的應用非…

    編程 2025-04-23

發表回復

登錄後才能評論