@@ -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
233245func 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+
280298func 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
285318func 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
293343func ConvertToString (src string , srcCode string , tagCode string ) string {
0 commit comments