Files
go-utils/utils/get.go
2023-07-26 14:47:58 +08:00

113 lines
2.0 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package utils
import (
"fmt"
"github.com/spf13/cast"
"net"
"os"
"strings"
"sync"
)
// GetType - 获取数据类型
func GetType(value any) (result string) {
result, _ = typeof(value)
return result
}
// GetIp - 获取客户端IP
func GetIp(key ...string) (result any) {
type lock struct {
Lock *sync.RWMutex
Data map[string]any
}
wr := lock{
Data: make(map[string]any, 2),
Lock: &sync.RWMutex{},
}
wg := sync.WaitGroup{}
wg.Add(2)
go func() {
defer wg.Done()
conn, _ := net.Dial("udp", "8.8.8.8:80")
defer func(conn net.Conn) {
err := conn.Close()
if err != nil {
fmt.Println("intranet err", err)
}
}(conn)
localAddr := conn.LocalAddr().String()
idx := strings.LastIndex(localAddr, ":")
wr.Lock.Lock()
wr.Data["intranet"] = localAddr[0:idx]
wr.Lock.Unlock()
}()
go func() {
defer wg.Done()
// 外网IP - 替代品https://api.ipify.org https://ipinfo.io/ip https://api.ip.sb/ip
item := Curl().Get("https://myexternalip.com/raw").Send()
if item.Error != nil {
return
}
wr.Lock.Lock()
wr.Data["extranet"] = item.Text
wr.Lock.Unlock()
}()
wg.Wait()
if len(key) > 0 {
return wr.Data[key[0]]
}
return wr.Data
}
// GetMac - 获取本机MAC
func GetMac() (result string) {
interfaces, err := net.Interfaces()
if err != nil {
return ""
}
for _, item := range interfaces {
// 过滤掉非物理接口类型
if item.Flags&net.FlagUp != 0 && item.Flags&net.FlagLoopback == 0 && item.Flags&net.FlagPointToPoint == 0 {
if value, err := item.Addrs(); err == nil {
for _, val := range value {
if IPNet, ok := val.(*net.IPNet); ok && !IPNet.IP.IsLoopback() {
if mac := item.HardwareAddr; len(mac) > 0 {
return cast.ToString(mac)
}
}
}
}
}
}
return ""
}
// GetPid - 获取进程ID
func GetPid() (result int) {
process, err := os.FindProcess(os.Getpid())
if err != nil {
return 0
}
return process.Pid
}
// GetPwd - 获取当前目录
func GetPwd() (result string) {
dir, err := os.Getwd()
if err != nil {
return ""
}
return dir
}