You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

95 lines
1.7 KiB
Go

package tools
import (
"fmt"
"net"
"os"
"strings"
)
// ReadConfig 从指定路径读取配置文件内容并返回字节切片
func ReadConfig(path string) ([]byte, error) {
// 检查文件是否存在
if _, err := os.Stat(path); os.IsNotExist(err) {
return nil, err
}
// 读取文件内容
data, err := os.ReadFile(path)
if err != nil {
return nil, err
}
// 检查文件内容是否为空
if len(data) == 0 {
return nil, fmt.Errorf("配置文件 %s 为空", path)
}
return data, err
}
// CheckStringAlphabet
//
// @Description: 检查字符串是否为域名
// @param str
// @return bool
func CheckStringAlphabet(str string) bool {
L := len(str)
if L < 1 {
return false
}
charVariable := str[L-1:]
// ipv6
if strings.Contains(str, ":") {
return false
}
// ipv4
if charVariable >= "0" && charVariable <= "9" {
return false
}
return true
}
// Reverse
//
// @Description: 反转域名字符串
// @param s
// @return string
func Reverse(s string) string {
if !CheckStringAlphabet(s) {
return s
}
r := []rune(s)
for i, j := 0, len(r)-1; i < j; i, j = i+1, j-1 {
r[i], r[j] = r[j], r[i]
}
return string(r)
}
// GetFreePort 函数用于获取一个可用的随机端口号,并在函数结束后关闭监听器。
func GetFreePort() (int, error) {
return GetFreeWithPort(0)
}
// GetFreeWithPort 检测端口是否可用
func GetFreeWithPort(port int) (int, error) {
addr, err := net.ResolveTCPAddr("tcp", fmt.Sprintf("localhost:%d", port))
if err != nil {
return 0, err
}
l, err := net.ListenTCP("tcp", addr)
if err != nil {
return 0, err
}
defer func(l *net.TCPListener) {
err := l.Close()
if err != nil {
}
}(l)
return l.Addr().(*net.TCPAddr).Port, nil
}