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
95 lines
1.7 KiB
Go
|
1 year ago
|
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
|
||
|
|
}
|