-
Notifications
You must be signed in to change notification settings - Fork 0
/
small_tool.go
248 lines (222 loc) · 4.84 KB
/
small_tool.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
package misc
import (
"bufio"
"cmp"
"fmt"
"golang.org/x/text/encoding/simplifiedchinese"
"golang.org/x/text/transform"
"io"
"os"
"os/exec"
"path/filepath"
"strings"
"time"
)
// Str2list 将json风格的数组字符串s转换为字符串
func Str2list(s string) []string {
return strings.Split(s[1:len(s)-1], ",")
}
// MinMaxSlice 求一个切片的最大最小值
func MinMaxSlice[T cmp.Ordered](array []T) (min T, minIndex int, max T, maxIndex int) {
max = array[0]
min = array[0]
for i, value := range array {
if max < value {
max = value
maxIndex = i
}
if min > value {
min = value
minIndex = i
}
}
return
}
// MinMaxInt 求一个int切片的最大最小值
func MinMaxInt(array []int) (min int, minIndex int, max int, maxIndex int) {
max = array[0]
min = array[0]
for i, value := range array {
if max < value {
max = value
maxIndex = i
}
if min > value {
min = value
minIndex = i
}
}
return
}
// MinMaxUInt 求一个int切片的最大最小值
func MinMaxUInt(array []uint32) (min uint32, minIndex int, max uint32, maxIndex int) {
max = array[0]
min = array[0]
for i, value := range array {
if max < value {
max = value
maxIndex = i
}
if min > value {
min = value
minIndex = i
}
}
return
}
type CanCompare interface {
Less(CanCompare) bool
}
// MinMax 求一个CanCompare切片的最大最小值
func MinMax(array []CanCompare) (min CanCompare, minIndex int, max CanCompare, maxIndex int) {
max = array[0]
min = array[0]
for i, value := range array {
if max.Less(value) {
max = value
maxIndex = i
}
if min.Less(value) {
min = value
minIndex = i
}
}
return
}
// GetTimeStr 返回当前的时间,格式为2006-01-02 15:04:05
func GetTimeStr() string {
return time.Now().Format("2006-01-02 15:04:05")
}
func InputStr(len int) string {
re := ""
for i := 0; i < len; i++ {
re += "_"
}
for i := 0; i < len; i++ {
re += "\b"
}
return re
}
func Input(hint string, len int, a ...interface{}) error {
print(hint + InputStr(len))
_, err := fmt.Scan(a...)
return err
}
func Stop() {
fmt.Printf("输入任意键继续...")
ClearIOBuffer()
b := make([]byte, 1)
// 不知道为什么清空缓冲区后,还是有残留一个ascii为10的字符。。。但是goland里面调试时好的。。
_, err := os.Stdin.Read(b)
_, err = os.Stdin.Read(b)
if err != nil {
return
}
}
func ClearIOBuffer() {
myReader := bufio.NewReader(os.Stdin)
myReader.Reset(os.Stdin)
_, _ = myReader.ReadString('\n')
}
// IsLegalOutURL 判断是否是合法的外链
func IsLegalOutURL(url string) bool {
if len(url) < 6 {
return false
}
if strings.Index(url, "://") == -1 {
return false
}
return true
}
// Clear 清空屏幕
func Clear() {
cmd := exec.Command("cmd.exe", "/c", "cls")
cmd.Stdout = os.Stdout
err := cmd.Run()
if err != nil {
print("clear fail")
}
}
// GetRealDir 返回当前可执行程序的真正目录,如果是软链接,则返回软链接指向的文件的目录
func GetRealDir() string {
// 获取当前可执行程序的路径
exePath, _ := os.Executable()
// 获取当前可执行程序的目录
exeDir := filepath.Dir(exePath)
// 如果是软链接,获取软链接的路径
if linkPath, err := os.Readlink(exePath); err == nil {
// 如果是软链接,则获取软链接的绝对路径
linkDir := filepath.Dir(linkPath)
exeDir = linkDir
}
return exeDir
}
func InputString(notice string) string {
fmt.Print(notice)
var fileNames string
_, err := fmt.Scanln(&fileNames)
if err != nil {
return ""
}
return fileNames
}
func InputStringWithSpace(notice string) []string {
var msg string
fmt.Print(notice)
reader := bufio.NewReader(os.Stdin)
msg, _ = reader.ReadString('\n')
msg = strings.TrimSpace(msg)
msgList := strings.Split(msg, " ")
return msgList
}
func InputInt(notice string) int {
fmt.Print(notice)
var choice int
_, err := fmt.Scanln(&choice)
if err != nil {
return 0
}
return choice
}
func ReadGBKFileLine(addr string) (string, error) {
file, err := os.Open(addr)
if err != nil {
return "", err
}
defer file.Close()
reader := bufio.NewReader(file)
decoder := simplifiedchinese.GB18030.NewDecoder()
returnStr := ""
for {
line, err := reader.ReadString('\n')
if err == io.EOF && len(line) == 0 {
break
}
// 去除末尾的\r\n
line = strings.TrimSuffix(line, "\n")
line = strings.TrimSuffix(line, "\r")
line, _, err = transform.String(decoder, line)
if err != nil {
return "", err
}
returnStr += line
}
return returnStr, nil
}
func WriteGBKFileLine(addr string, content string) error {
file, err := os.Create(addr)
if err != nil {
return err
}
defer file.Close()
encoder := simplifiedchinese.GB18030.NewEncoder()
encodedLine, err := encoder.String(content)
if err != nil {
return err
}
_, err = file.WriteString(encodedLine + "\r\n")
if err != nil {
return err
}
return nil
}