一、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