Skip to content

Commit 6f72fff

Browse files
committed
Update string.go
1 parent 89c94ed commit 6f72fff

File tree

1 file changed

+65
-15
lines changed

1 file changed

+65
-15
lines changed

internal/tools/string.go

Lines changed: 65 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"os"
1414
"strconv"
1515
"strings"
16+
"sync"
1617
"time"
1718
"unicode"
1819
"unicode/utf8"
@@ -208,26 +209,37 @@ func SizeFormat(size float64) string {
208209
return strconv.FormatFloat(size, 'f', 2, 32) + " " + units[n]
209210
}
210211

211-
func RandString(len int) string {
212-
rand.Seed(time.Now().UnixNano())
212+
var randSource = rand.NewSource(time.Now().UnixNano())
213+
var randGen = rand.New(randSource)
213214

214-
bytes := make([]byte, len)
215-
for i := 0; i < len; i++ {
216-
b := rand.Intn(26) + 65
215+
func RandString(length int) string {
216+
bytes := make([]byte, length)
217+
for i := 0; i < length; i++ {
218+
b := randGen.Intn(26) + 65
217219
bytes[i] = byte(b)
218220
}
219221
return string(bytes)
220222
}
221223

222-
func RemoveDuplicatesAndEmpty(a []string) (ret []string) {
223-
a_len := len(a)
224-
for i := 0; i < a_len; i++ {
225-
if (i > 0 && a[i-1] == a[i]) || len(a[i]) == 0 {
224+
func RemoveDuplicatesAndEmpty(a []string) []string {
225+
if len(a) == 0 {
226+
return nil
227+
}
228+
229+
// 预分配内存,最坏情况是所有元素都不重复且非空
230+
ret := make([]string, 0, len(a))
231+
var prev string
232+
233+
for i, s := range a {
234+
if (i > 0 && s == prev) || len(s) == 0 {
226235
continue
227236
}
228-
ret = append(ret, a[i])
237+
ret = append(ret, s)
238+
prev = s
229239
}
230-
return
240+
241+
// 调整切片容量,减少内存使用
242+
return ret[:len(ret):len(ret)]
231243
}
232244

233245
func GetHttpData(url string) (string, error) {
@@ -277,17 +289,55 @@ func ReadFile(file string) (string, error) {
277289
return string(b), err
278290
}
279291

292+
var base64BufferPool = sync.Pool{
293+
New: func() interface{} {
294+
return make([]byte, 1024)
295+
},
296+
}
297+
280298
func Base64encode(in string) string {
281-
encodeString := base64.StdEncoding.EncodeToString([]byte(in))
282-
return encodeString
299+
src := []byte(in)
300+
maxLen := base64.StdEncoding.EncodedLen(len(src))
301+
302+
// 从池中获取缓冲区
303+
dst := base64BufferPool.Get().([]byte)
304+
if cap(dst) < maxLen {
305+
// 如果缓冲区不够大,重新分配
306+
dst = make([]byte, maxLen)
307+
}
308+
dst = dst[:maxLen]
309+
310+
base64.StdEncoding.Encode(dst, src)
311+
result := string(dst)
312+
313+
// 归还缓冲区到池
314+
base64BufferPool.Put(dst)
315+
return result
283316
}
284317

285318
func Base64decode(in string) (string, error) {
286-
decodeBytes, err := base64.StdEncoding.DecodeString(in)
319+
src := []byte(in)
320+
maxLen := base64.StdEncoding.DecodedLen(len(src))
321+
322+
// 从池中获取缓冲区
323+
dst := base64BufferPool.Get().([]byte)
324+
if cap(dst) < maxLen {
325+
// 如果缓冲区不够大,重新分配
326+
dst = make([]byte, maxLen)
327+
}
328+
329+
n, err := base64.StdEncoding.Decode(dst, src)
287330
if err != nil {
331+
// 归还缓冲区到池
332+
base64BufferPool.Put(dst)
288333
return in, err
289334
}
290-
return string(decodeBytes), nil
335+
336+
result := string(dst[:n])
337+
338+
// 归还缓冲区到池
339+
base64BufferPool.Put(dst)
340+
return result, nil
291341
}
292342

293343
func ConvertToString(src string, srcCode string, tagCode string) string {

0 commit comments

Comments
 (0)