代码拉取完成,页面将自动刷新
package util
import (
"bufio"
"bytes"
"fmt"
"github.com/mitchellh/go-homedir"
"net"
"os"
"os/exec"
"path/filepath"
"reflect"
"runtime"
"strconv"
)
// ShellExecWalk 逐行处理命令执行结果
func ShellExecWalk(fn func(s string) error, cmdBin string, args ...string) error {
var out bytes.Buffer
cmd := exec.Command(cmdBin, args...)
cmd.Stdout = &out
if err := cmd.Run(); err != nil {
return err
}
sc := bufio.NewScanner(&out)
for sc.Scan() {
if err := fn(sc.Text()); err != nil {
return err
}
}
return nil
}
// ShellExec 执行命令
func ShellExec(cmdBin string, args ...string) (ret []string, err error) {
err = ShellExecWalk(func(s string) error {
ret = append(ret, s)
return nil
}, cmdBin, args...)
return
}
// RandInt 获得随机数
func RandInt(i int) int {
if i <= 1 {
return 0
}
return _rand.Intn(i)
}
// RandRange 按范围取随机值 [min, max)
func RandRange(min, max int) int {
if max <= min {
min, max = max, min
}
return RandInt(max-min) + min
}
// LocalIp 获取内网 IP
func LocalIp() string {
as, err := net.InterfaceAddrs()
if err != nil {
return ""
}
for _, address := range as {
if in, ok := address.(*net.IPNet); ok && !in.IP.IsLoopback() {
if in.IP.To4() != nil {
return in.IP.String()
}
}
}
return ""
}
// InArray needle 是否存在于 haystack 中
func InArray(needle any, haystack any) (isIn bool, err error) {
val := reflect.ValueOf(haystack)
switch val.Kind() {
case reflect.Slice, reflect.Array:
for i := 0; i < val.Len(); i++ {
if reflect.DeepEqual(needle, val.Index(i).Interface()) {
isIn = true
return
}
}
return
case reflect.Map:
for _, k := range val.MapKeys() {
if reflect.DeepEqual(needle, val.MapIndex(k).Interface()) {
isIn = true
return
}
}
return
default:
err = fmt.Errorf("haystack: haystack must be slice, array or map")
return
}
}
// InterfaceToInt interface 转为 int
func InterfaceToInt(v any) (ret int) {
ret = int(InterfaceToInt64(v))
return
}
// InterfaceToInt64 interface 转为 int64
func InterfaceToInt64(v any) (ret int64) {
ret, _ = strconv.ParseInt(InterfaceToStr(v), 10, 64)
return
}
// InterfaceToFloat64 interface 转为 float64
func InterfaceToFloat64(v any) (ret float64) {
ret, _ = strconv.ParseFloat(InterfaceToStr(v), 64)
return
}
// InterfaceToStr interface 转为 string
func InterfaceToStr(v any) (ret string) {
if v == nil {
return
}
var ok bool
if ret, ok = v.(string); ok {
return
} else {
ret = fmt.Sprintf("%v", v)
}
return
}
// VarDump 打印变量
func VarDump(v ...any) {
_, f, l, _ := runtime.Caller(1)
fmt.Printf("----- %s : %d @ %s -----\n", f, l, TimeNowNice())
for _, item := range v {
fmt.Printf("%+v\n", item)
}
}
// GetBinPath 取可执行程序的绝对路径
func GetBinPath() (string, error) {
return filepath.Abs(filepath.Dir(os.Args[0]))
}
// GetHomeDir 获取当前用户的Home根目录路径
func GetHomeDir() (string, error) {
return homedir.Dir()
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。