gotool

Gotool is a small and complete Set of Golang tools. It mainly refines and integrates commonly used methods in daily development to avoid repeated wheel building and improve work efficiency. Every method is extracted from previous projects by the author through working experience.

2021-7-9 Update details please see the document

  • Add file I/O operation tool FileUtils
  • The verification code generation tool CaptchaUtils was added
  • Added the file and directory compression and decompression tool ZipUtis
  • String array utility StrArrayUtils

How do you use Gotool?

The installation

go get github.com/druidcaesa/gotool

go.mod github.com/druidcaesa/gotool

The introduction of

import "github.com/druidcaesa/gotool"
Copy the code

StrUtils

Golang is a string utility set, which basically covers the most frequently used tools in development

1, gotool. StrUtils. ReplacePlaceholder placeholder is replaced

func TestStringReplacePlaceholder(t *testing.T) {
s := "You are my {}, I am your {}"
placeholder, err := gotool.StrUtils.ReplacePlaceholder(s, "The only"."All")
if err == nil {
fmt.Println(placeholder)
}
}
//out= = = RUN TestStringReplacePlaceholder you are my only, I am your all - PASS: TestStringReplacePlaceholder (0.00s)
PASS
Copy the code

2, gotool. StrUtils. RemoveSuffix remove file extension for the file name

func TestRemoveSuffix(t *testing.T) {
fullFilename := "test.txt"
suffix, _ := gotool.StrUtils.RemoveSuffix(fullFilename)
fmt.Println(suffix)
fullFilename = "/root/home/test.txt"
suffix, _ = gotool.StrUtils.RemoveSuffix(fullFilename)
fmt.Println(suffix)
}
//out
== = RUN   TestRemoveSuffix
test
test
--- PASS: TestRemoveSuffix (0.00s)
PASS
Copy the code

3, gotool. StrUtils. GetSuffix for file extension

func TestGetSuffix(t *testing.T) {
fullFilename := "test.txt"
suffix, _ := gotool.StrUtils.GetSuffix(fullFilename)
fmt.Println(suffix)
fullFilename = "/root/home/test.txt"
suffix, _ = gotool.StrUtils.GetSuffix(fullFilename)
fmt.Println(suffix)
}
//out
== = RUN   TestGetSuffix
.txt
.txt
--- PASS: TestGetSuffix (0.00s)
PASS
Copy the code

Gotool.strutils. HasEmpty checks if the string is not empty

func TestHasStr(t *testing.T) {
str := ""
empty := gotool.StrUtils.HasEmpty(str)
fmt.Println(empty)
str = "11111"
empty = gotool.StrUtils.HasEmpty(str)
fmt.Println(empty)
}
//out
== = RUN   TestHasStr
true
false
--- PASS: TestHasStr (0.00s)
PASS

Copy the code

StrArrayUtils String array manipulation tool

1, gotool. StrArrayUtils. StringToInt64 string array int64 array, please make sure that before invoking an array of strings are all digital

func TestStringToInt64(t *testing.T) {
// String array to int64
strings := []string{"1"."23123"."232323"}
fmt.Println(reflect.TypeOf(strings[0]))
toInt64, err := gotool.StrArrayUtils.StringToInt64(strings)
iferr ! =nil {
t.Fatal(err)
}
fmt.Println(reflect.TypeOf(toInt64[0))}//out
== = RUN   TestStringToInt64
string
int64
--- PASS: TestStringToInt64 (0.00s)
PASS
Copy the code

2, gotool. StrArrayUtils. StringToInt32 string array int64 array, please make sure that before invoking an array of strings are all digital

func TestStringToInt32(t *testing.T) {
// String array to int64
strings := []string{"1"."23123"."232323"}
fmt.Println(reflect.TypeOf(strings[0]))
toInt64, err := gotool.StrArrayUtils.StringToInt32(strings)
iferr ! =nil {
t.Fatal(err)
}
fmt.Println(reflect.TypeOf(toInt64[0))}//out
== = RUN   TestStringToInt32
string
int32
--- PASS: TestStringToInt32 (0.00s)
PASS
Copy the code

3, gotool. StrArrayUtils. ArrayDuplication array to heavy

func TestArrayDuplication(t *testing.T) {
// String array decrement
strings := []string{"hello"."word"."gotool"."word"}
fmt.Println(----------------->, strings)
duplication := gotool.StrArrayUtils.ArrayDuplication(strings)
fmt.Println("After heavy ----------------->", duplication)
}
//out= = = RUN TestArrayDuplication to heavy before -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- > [hello word gotool word] to after heavy -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- > [hello word gotool] --- PASS: TestArrayDuplication (0.00s)
PASS
Copy the code

DateUtil

Golang is a time manipulation tool set, which basically covers the tools often used in development

1, gotool. DateUtil. FormatToString time formatted into a string

func TestFormatToString(t *testing.T) {
now := gotool.DateUtil.Now()
toString := gotool.DateUtil.FormatToString(&now, "YYYY-MM-DD hh:mm:ss")
fmt.Println(toString)
toString = gotool.DateUtil.FormatToString(&now, "YYYYMMDD hhmmss")
fmt.Println(toString)
}
// Year month day corresponds to YYYY MM DD minute second HHMMSS can be any combination, such as YYYY HH YYYY-DD hh: MM
//out
== = RUN   TestFormatToString
202107 -07 - 16:13:30
20210707 161330
--- PASS: TestFormatToString (0.00s)
PASS
Copy the code

2. Gotool.dateutil. IsZero checks whether the time is empty

// Time is null true otherwise false
func TestDate_IsZero(t *testing.T) {
t2 := time.Time{}
zero := gotool.DateUtil.IsZero(t2)
fmt.Println(zero)
zero = gotool.DateUtil.IsZero(gotool.DateUtil.Now())
fmt.Println(zero)
}
//out
== = RUN   TestDate_IsZero
true
false
--- PASS: TestDate_IsZero (0.00s)
PASS
Copy the code

Gotool.dateutil.now gets the current time equal to time.now (), which is included in the tool for uniformity

4, gotool. DateUtil. InterpretStringToTimestamp type string formatted into time

Parameter 1 Time string to be formatted Parameter 2 The format of the string must be the same as that of the string to be formatted
For example, 2021-6-4 corresponds to YYYY-MM-DD. 2021.6.4 corresponds to YYYY.mm-dd
func TestInterpretStringToTimestamp(t *testing.T) {
timestamp, err := gotool.DateUtil.InterpretStringToTimestamp("The 2021-05-04 15:12:59"."YYYY-MM-DD hh:mm:ss")
iferr ! =nil {
gotool.Logs.ErrorLog().Println(err.Error())
}
fmt.Println(timestamp)
}
//out
== = RUN   TestInterpretStringToTimestamp
1620112379
--- PASS: TestInterpretStringToTimestamp (0.00s)
PASS
Copy the code

5, gotool. DateUtil. UnixToTime timestamp transfer time

func TestUnixToTime(t *testing.T) {
unix := gotool.DateUtil.Now().Unix()
fmt.Println("Timestamp ----------------------->", unix)
toTime := gotool.DateUtil.UnixToTime(unix)
fmt.Println(toTime)
}
//out= = = RUN TestUnixToTime time stamp -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- >1625645682
202107 -07 - 16:14:42 +0800 CST
--- PASS: TestUnixToTime (0.00s)
PASS
Copy the code

6, gotool. DateUtil. GetWeekDay for week

func TestGetWeekDay(t *testing.T) {
now := gotool.DateUtil.Now()
day := gotool.DateUtil.GetWeekDay(now)
fmt.Println("Today is ----------------- week", day)
}
//out== = RUN TestGetWeekDay Today is ----------------- week3
--- PASS: TestGetWeekDay (0.00s)
PASS
Copy the code

7, gotool. DateUtil. MinuteAddOrSub HourAddOrSub, DayAddOrSub time calculation tool

// Time count
func TestTimeAddOrSub(t *testing.T) {
now := gotool.DateUtil.Now()
fmt.Println("The time is --------------------->", now)
sub := gotool.DateUtil.MinuteAddOrSub(now, 10)
fmt.Println("Minute calculation result -------------------->", sub)
sub = gotool.DateUtil.MinuteAddOrSub(now, - 10)
fmt.Println("Minute calculation result -------------------->", sub)
sub = gotool.DateUtil.HourAddOrSub(now, 10)
fmt.Println("Hourly calculation result -------------------->", sub)
sub = gotool.DateUtil.HourAddOrSub(now, - 10)
fmt.Println("Hourly calculation result -------------------->", sub)
sub = gotool.DateUtil.DayAddOrSub(now, 10)
fmt.Println("Day calculation results -------------------->", sub)
sub = gotool.DateUtil.DayAddOrSub(now, - 10)
fmt.Println("Day calculation results -------------------->", sub)
}
/ / the time is now -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - > 2021-07-07 11:18:17. 8295757 + 0800 CST m = + 0.012278001
Calculation results / / minutes -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - > 2021-07-07 11:28:17. 8295757 + 0800 CST m = + 600.012278001
Calculation results / / minutes -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - > 2021-07-07 11:08:17. 8295757 + 0800 CST m = 599.987721999
/ / hour calculation result -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - > 2021-07-07 21:18:17. 8295757 + 0800 CST m = + 36000.012278001
/ / hour calculation result -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - > 2021-07-07 01:18:17. 8295757 + 0800 CST m = 35999.987721999
/ / day calculation result -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - > 2021-07-17 11:18:17. 8295757 + 0800 CST m = + 864000.012278001
/ / day calculation result -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - > 2021-06-27 11:18:17. 8295757 + 0800 CST m = 863999.987721999
Copy the code

ConvertUtils Gregorian calendar to lunar tool

1, gotool. ConvertUtils. GregorianToLunarCalendar (Gregorian calendar lunar calendar), GetLunarYearDays (lunar calendar), GetLunarYearDays (access to the lunar calendar this year lunar calendar days)

func TestConvertTest(t *testing.T) {
calendar := gotool.ConvertUtils.GregorianToLunarCalendar(2020.2.1)
fmt.Println(calendar)
gregorian := gotool.ConvertUtils.LunarToGregorian(calendar[0], calendar[1], calendar[2].false)
fmt.Println(gregorian)
days := gotool.ConvertUtils.GetLunarYearDays(2021)
fmt.Println(days)
}
/ / 1 8 [2020]
/ / [2020 1, 2]
/ / 354
Copy the code

2, gotool. ConvertUtils. GetSolarMonthDays (2021, 7) to obtain the Gregorian calendar month number of days in July 2021

3, gotool. ConvertUtils. IsLeapYear (2021) to get one is true or false is not in

4, gotool. ConvertUtils. GetLeapMonth get some year leap month month (2021)

BcryptUtils encryption and decryption tool

1, gotool. BcryptUtils. Generate encryption processing, usually for the password will be encrypted in a database storage use, irreversible

2, gotool.BcryptUtils.Com pareHash encrypted and unencrypted password contrast, mostly used for login authentication

func TestGenerate(t *testing.T) {
// Encrypt
generate := gotool.BcryptUtils.Generate("123456789")
fmt.Println(generate)
// Encrypt comparison
hash := gotool.BcryptUtils.CompareHash(generate, "123456789")
fmt.Println(hash)
}
//out
== = RUN   TestGenerate
$2a$10$IACJ6zGuNuzaumrvDz58Q.vJUzz4JGqougYKrdCs48rQYIRjAXcU2
true
--- PASS: TestGenerate (0.11s)
PASS
Copy the code

3. Gotool.bcryptutils. MD5 MD5 encryption

func TestMd5(t *testing.T) {
md5 := gotool.BcryptUtils.MD5("123456789")
fmt.Println(md5)
}
//out
== = RUN   TestMd5
25f9e794323b453885f5181f1b624d0b
--- PASS: TestMd5 (0.00s)
PASS
Copy the code

4, gotool. BcryptUtils. GenRsaKey (access to public and private keys),

5, RsaSignWithSha256(to sign),

6, RsaVerySignWithSha256(verify),

7. RsaEncrypt(public key encryption),

RsaDecrypt(private key decryption)

func TestRsa(t *testing.T) {
// The RSA key file is generated
fmt.Println("-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- for RSA public/private key -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -")
prvKey, pubKey := gotool.BcryptUtils.GenRsaKey()
fmt.Println(string(prvKey))
fmt.Println(string(pubKey))

fmt.Println("-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- for signature and verification operation -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -")
var data = "I am encrypted data remember me oh -------------------------------"
fmt.Println("Sign the message...")
signData := gotool.BcryptUtils.RsaSignWithSha256([]byte(data), prvKey)
fmt.Println("Message signature information:", hex.EncodeToString(signData))
fmt.Println("\n Verify signature information...")
if gotool.BcryptUtils.RsaVerySignWithSha256([]byte(data), signData, pubKey) {
fmt.Println("Signature information verified successfully, confirm correct private key signature!!")
}

fmt.Println("-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - encrypt decrypt operation -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -")
ciphertext := gotool.BcryptUtils.RsaEncrypt([]byte(data), pubKey)
fmt.Println("Public key encrypted data:", hex.EncodeToString(ciphertext))
sourceData := gotool.BcryptUtils.RsaDecrypt(ciphertext, prvKey)
fmt.Println("Private key decrypted data:".string(sourceData))
}
//out= = = RUN TestRsa -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - to obtain RSA public/PRIVATE key -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- BEGIN RSA PRIVATE  KEY----- MIICXAIBAAKBgQCgHh1ZYFjlxrIJYjjWGFaLwC8Oov8KqyMtHa+GauF121dperr3 i46JyDoskoSBhbkmqv70LMNrjqVdttdIsC0BtH9ThWLBwKVLH56EqfzqlzClKZEh WTNaddCSuxoZpN33mwS82DCjZe3d7nAPdEGD5pSBx6TVt5bG1c3NVAmcBQIDAQAB AoGAWc5KO9T0R3xYYzb6Fer0r9GNEzKMxdkTE7zws/3Cky4BKyIxN6LIwbLSHinX
tCXioTOLaDyrJuqNCbEBsr1NoCIPxnswA5Jm5QDYO5x9aq4u8+SZ9KqLbMrO1JDS
ZV7Cbiblz1xNMfdVIvlVjD5RdEotbYTbHI2CZUoPsjHng8kCQQDHi6TJYJqvej8r
q46ZceuWHDgE81Wu16RrA/kZKi6MJAApQtfO/4HM6W/ImbCjZ2rSYxqnAlIg/GxA
dT6iJABjAkEAzWra06RyhGm3lk9j9Xxc0YPX6VX7qT5Iq6c7ry1JtTSeVOksKANG
elaNnCj8YYUgj7BeBBcMMvLd39hP1h06dwJAINTyHQwfB2ZGxImqocajq4QjF3Vu
EKF8dPsnXiOZmwdFW4Sa+30Av1VdRhU7gfc/FTSnKvlvx+ugaA6iao0f3wJBALa8 sTCH4WwUE8K+m4DeAkBMVn34BKnZg5JYcgrzcdemmJeW2rY5u6/HYbCi8WnboUzS K8Dds/d7AJBKgTNLyx8CQBAeU0St3Vk6SJ6H71J8YtVxlRGDjS2fE0JfUBrpI/bg r/QI8yMAMyFkt1YshN+UNWJcvR5SXQnyT/udnWJIdg4 = -----END RSA PRIVATE KEY----- -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCgHh1ZYFjlxrIJYjjWGFaLwC8O ov8KqyMtHa+GauF121dperr3i46JyDoskoSBhbkmqv70LMNrjqVdttdIsC0BtH9T hWLBwKVLH56EqfzqlzClKZEhWTNaddCSuxoZpN33mwS82DCjZe3d7nAPdEGD5pSB x6TVt5bG1c3NVAmcBQIDAQAB -----END PUBLIC KEY----- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - for signature and verification operation -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - the message signature operation... Message signature information:1fcf20c4fb548c8fc0906e369287feb84c861bf488d822d78a0eada23d1af66ed3a12e9440d7181b1748fd0ad805222cf2ce7ce1f6772b330ef11b717 700ba26945dda9d749a5c4d8c108ede103c17bed92801a4c3fbc1ebf38d10bf4bf183713eeb7f429acc3dcc3812366a324737f756720f3f9e75ddda1 E024a7698b89163 Verifying signature Information... The signature information is verified successfully. Confirm the correct private key signature!! -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - encrypt decrypt operation -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - after a public key encryption of data:637b05798c1cf95cfcc63adf228645c77f8e9a9f34b12b722e6938ded8c9560a0430171a4f940d3fb2d96bc6c470c80a817d81f4a2669b991adbff5b22b 335129e514c921083ce3e64c1c876409d9b763d5e8e269797283ef951a364da6a59a1d8454391356cb0cd0808092e9dd7ac371f9247a43760f3c82b7 Ad26a32a7a807 decrypted data: after I was encrypted data remember me -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- PASS: TestRsa (0.02s)
PASS
Copy the code

ZipUtils

Compression and decompression tool, can be compressed single file, directory compression, or cross-directory compression

1, press at gotool.ZipUtils.Com

  • An array of files can be a multi-directory file
  • Dest Compressed file storage address
func TestCompress(t *testing.T) {
open, err := os.Open("/Users/fanyanan/Downloads/gotool")
iferr ! =nil {
t.Fatal(err)
}
files := []*os.File{open}
flag, err := gotool.ZipUtils.Compress(files, "/Users/fanyanan/Downloads/test.zip")
iferr ! =nil {
t.Fatal(err)
}
if flag {
fmt.Println("Compression succeeded")}}//out== = RUN compress successfully -- PASS: TestCompress (0.12s)
PASS
Copy the code

2, gotool. ZipUtils. DeCompress

  • ZipFile Zip package path
  • Dest Indicates the path to decompress
func TestDeCompress(t *testing.T) {
compress, err := gotool.ZipUtils.DeCompress("/Users/fanyanan/Downloads/test.zip"."/Users/fanyanan/Downloads")
iferr ! =nil {
t.Fatal(err)
}
if compress {
fmt.Println("Unzipped successfully")}}//out== = RUN TestDeCompress successfully -- PASS: TestDeCompress (0.44s)
PASS
Copy the code

FileUtils

File operation tool, so that do IO operation more simple each convenient, so that IO operation is not so difficult

1. Gotool.fileutils. Exists Checks whether a file or directory Exists

func TestFileExists(t *testing.T) {
// Check whether a file or directory exists
exists := gotool.FileUtils.Exists("F:/go-test/test")
fmt.Println("Before creation ------------------------>", exists)
err := os.MkdirAll("F:/go-test/test", os.ModePerm)
iferr ! =nil {
t.Fatal(err)
}
exists = gotool.FileUtils.Exists("F:/go-test/test")
fmt.Println("After creation ------------------------>", exists)
}
//out= = = RUN TestFileExists created before -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- >falseAfter creation -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- >true
--- PASS: TestFileExists (0.00s)
PASS
Copy the code

2. Gotool.fileutils. IsDir Check whether it is a directory

func TestIsDir(t *testing.T) {
// Check if it is a directory
dir := gotool.FileUtils.IsDir("F:/go-test/test")
fmt.Println("Is it directory --------------------->", dir)
dir = gotool.FileUtils.IsDir("F:/go-test/test/test.txt")
fmt.Println("Is it directory --------------------->", dir)
}
//out== = RUN TestIsDir Whether it is a directory --------------------->trueIs it a directory --------------------->false
--- PASS: TestIsDir (0.00s)
PASS
Copy the code

3. Check whether gotool.fileutils. IsFile is a file

func TestIsFile(t *testing.T) {
// Check whether it is a file
file := gotool.FileUtils.IsFile("F:/go-test/test")
fmt.Println("Is it a file --------------------->", file)
file = gotool.FileUtils.IsFile("F:/go-test/test/test.txt")
fmt.Println("Is it a file --------------------->", file)
}
//out== = RUN TestIsFile Whether it is a file --------------------->falseIs it a file --------------------->true
--- PASS: TestIsFile (0.00s)
PASS
Copy the code

4, gotool. FileUtils. RemoveFile to delete a file or directory

func TestRemove(t *testing.T) {
// Delete files
file, err := gotool.FileUtils.RemoveFile("F:/go-test/test/test.txt")
iferr ! =nil {
t.Fatal(err)
}
if file {
// Check whether the file still exists
exists := gotool.FileUtils.Exists("F:/go-test/test/test.txt")
fmt.Println("Does the file exist ------------------------>", exists)
}
}
//out= = = RUN TestRemove file exists -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- >false
--- PASS: TestRemove (0.00s)
PASS
Copy the code

5, gotool. FileUtils. OpenFileWronly only write mode to open the file, not automatically created, written from the test

func TestOpenFileWronly(t *testing.T) {
// Open a file in write only mode, and write 5 pieces of content. If the file does not exist, one will be created
path := "F:/go-test/test/test.txt"
str := "hello word gotool \n"
wronly, err := gotool.FileUtils.OpenFileWronly(path)
iferr ! =nil {
t.Fatal(err)
}
defer wronly.Close()
write := bufio.NewWriter(wronly)
for i := 0; i < 5; i++ {
write.WriteString(str)
}
//Flush actually writes the cached file to the file
write.Flush()
// The read file is written to the console
files, err := gotool.FileUtils.OpenFileRdonly(path)
iferr ! =nil {
t.Fatal(err)
}
defer files.Close()
reader := bufio.NewReader(files)
for {
str, err := reader.ReadString('\n')
iferr ! =nil {
break
}
fmt.Print(str)
}
}
//out
== = RUN   TestOpenFileWronly
hello word gotool
hello word gotool
hello word gotool
hello word gotool
hello word gotool
--- PASS: TestOpenFileWronly (0.00s)
PASS
Copy the code

6, gotool. FileUtils. OpenFileRdonly read-only mode to open the file, read the content of the output to the console

func TestOpenFileRdonly(t *testing.T) {
path := "F:/go-test/test/test.txt"
files, err := gotool.FileUtils.OpenFileRdonly(path)
iferr ! =nil {
t.Fatal(err)
}
defer files.Close()
reader := bufio.NewReader(files)
for {
str, err := reader.ReadString('\n')
iferr ! =nil {
break
}
fmt.Print(str)
}
}
//out
== = RUN   TestOpenFileRdonly
hello word gotool
hello word gotool
hello word gotool
hello word gotool
hello word gotool
--- PASS: TestOpenFileRdonly (0.00s)
PASS
Copy the code

7, gotool. FileUtils. OpenFileAppend open additional content files in the file behind, no will automatically create the file

func TestOpenFileAppend(t *testing.T) {
// Open the file to append data to the file
path := "F:/go-test/test/test.txt"
str := "Append content \n"
wronly, err := gotool.FileUtils.OpenFileAppend(path)
iferr ! =nil {
t.Fatal(err)
}
defer wronly.Close()
write := bufio.NewWriter(wronly)
for i := 0; i < 5; i++ {
write.WriteString(str)
}
//Flush actually writes the cached file to the file
write.Flush()
// The read file is written to the console
files, err := gotool.FileUtils.OpenFileRdonly(path)
iferr ! =nil {
t.Fatal(err)
}
defer files.Close()
reader := bufio.NewReader(files)
for {
str, err := reader.ReadString('\n')
iferr ! =nil {
break
}
fmt.Print(str)
}
}
//out== = RUN TestOpenFileAppend hello word gotool hello word gotool hello word gotool hello word gotool hello word gotool Append Content AppEnd Content AppEnd Content appEnd Content appEnd Content appEnd content -- PASS: TestOpenFileAppend (0.00s)
PASS
Copy the code

8, gotool. FileUtils. FileCopy file copying method

func TestFileCopy(t *testing.T) {
// File copy function
path := "F:/go-test/test/test.txt"
copyPath := "F:/go-test/test/test.txt1"
/ / copy of money
exists := gotool.FileUtils.Exists(copyPath)
fmt.Println("Does the file exist before copying ------------------>", exists)
/ / copy after
fileCopy, err := gotool.FileUtils.FileCopy(path, copyPath)
iferr ! =nil {
t.Fatal(err)
}
if fileCopy {
exists := gotool.FileUtils.Exists(copyPath)
fmt.Println("Does the file exist before copying ------------------>", exists)
}
}
//out= = = the RUN before TestFileCopy copy file exists -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- >falseCheck whether the file exists ------------------>true
--- PASS: TestFileCopy (0.00s)
PASS
Copy the code

CaptchaUtils Verification code generation tool

1, gotool. CaptchaUtils. GetRandStr generated captcha STRNG string

func TestCaptcha(t *testing.T) {
// Generate a verification code string, which can be redis and other stores for verification logic
str := gotool.CaptchaUtils.GetRandStr(6)
fmt.Println(str)
}
//out= = = RUN TestCaptcha generated captcha string -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- > qK5DME - PASS: TestCaptcha (0.01s)
PASS
Copy the code

2, gotool. CaptchaUtils. ImgText generated images [] byte array, can be converted into base64 or image file

func TestCaptcha(t *testing.T) {
str := gotool.CaptchaUtils.GetRandStr(6)
fmt.Println("Generate captcha string ------------------->", str)
// Generate image byte data, which can be converted to base64 or image as required
text := gotool.CaptchaUtils.ImgText(100.40, str)
sourcestring := base64.StdEncoding.EncodeToString(text)
fmt.Println(sourcestring)
}
//out= = = RUN TestCaptcha generated captcha string -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- > qK5DME iVBORw0KGgoAAAANSUhEUgAAAGQAAAAoCAYAAAAIeF9DAAAbcUlEQVR4nOx6B3Rc1bX2PuXeO6MZjUaj3nu15SbLHWNjcIuN8SMYjAMYnPZCebz3QscQWmiP FFoCoRhCCAaDzcPGxrjLlnuTrGJJltW7ZkbSaGZuO+dfd2TLCMtEAvK/ZK3stWbNle69Z87Z3y7f3udQVdd64V/yDyP4/3oC/5LB8i9A/sHkX4D8g8l3BqTX60FlNeXk+5nOBenqdKHve8x/BvnOgDi7u9Avf3ev9Mzbz0lev/c7K9Ht6kYP3PmYyfgU7thPv+t4/2zynQFJikli655b6zOur7v3BnPh8b3fWom6rqOiXQfJls92kJNHT2Gf1/9dp/d/Jowx5FN9qNvfg9o9HbixuxnXOGtxeXslOd5UQg7UHyF7aoro9qrdtKG7aQCH78UCg0xB/P5b75XnT59PHn/9CWnT3s3k3pX3KI5gOx/JOLrO4NihEuLp8aDImAhud4SM6P2hRNEUpOgqyEwFv+pDsiaDrClI1VSQdRlk1Y9UXw9SmQYyoXzgeV0BWZORX5NB0RVQNRUZ/zt/ bXzLugrq+ec1GfyaP3BtfHSmDztaZEaksTeuezFg1N9rSBiXOUb/4Om/+P60/k3h+vtuMP/H8ruURZct1L7+3LOP/F5afuu1amJKPPvq/0vrKvCR0uNEUVQQ7BSO+E+QkwdKiHxukaomo/PXiiYj1VCyoWBVPqcIQ4kqUs8rjmmI88GYSowjE+dg5hyMb6GmDyDeDKAyqLGIoAv4OxsBRpibBRMXiQAilf q/iQDCub8l4xoLYAo8I8LlqdP08++iv1dhWFVfjR9//UkpJDiEP7jqfiU2PIYZbnx4/3H826deFe2hdn7rvy9XJ8+YODCZf3vh5qDiV05htV0Da4EFQhfZAZu/nYIM8zQRCjYkgAVhCEaUWwCDiAmwdh/q/rIGaS4fEJMAgBCYU6I5jQjjVBR4SHoit0SF8SCbjQeHhXHTeeUSEUQqBpRoKFUULihbpCZuIiKYqAQEk28N6qU9ROcIPdUiQrOC4bYIhU+y6CMZOCMxna15/E3/+1vW0ptWrzStunqlesO867XW5jbcUNuEz1SehbTMZP5VQAqE8XqFVom5yGHShAn69GmTdYvJcs7S+hVx4VoAiUiAKEEWamIiEZDEOSeqgogqAyh+xDV58KQQABEtvLjwCFnX84ro7/GD1uMHhBDIbT0IE4JMViv0fHkCrA4Hz5t5uRY7JoRPunqOjvF395zhyKUBKfIQ9F6nELje0WOGmcE63Bsr80yJDXdww1JuWnijOjv/cv3JN58WtxRtpQ+uvE+Jio3iJcdLcfmpSnz8cAkZX5Cn97h7EXVR8Lp84AgP5fesvEvJzs1gmAytCKYpyO/rwS7FyUO8fUiT+xBwFojb519AmAI1WTkxWzk12TiRgoz/8fSpVo5+/wcBY4zisrJYZHIyaygvJ6LJxDsaGrDi9YLf40Hb331HCIuL4ye2bydX3rJSjcvOZmar9e8KzKUBSZMYt2JAnn79oz29BPaeDoLFoRr/zygFYsVvBKajx4UjbKGBZ+Kj4tgfH3zZ/9mejfTOF+6WUjIzuL3Wxk+XVeHiY6XYAMTv96P9hUcC9cykafl6qMPOz4PBGUNM8YLm70Wa34N02QNMlZEb6cjEEWiAuRF2iGTh1GzlRLICMQVzIpiGVF5USgpzxMTwPrcb2SMj+fyf/kyNSk6Wa4uLSXdHB3K2tqLyvYXE2dqKXS0t6OS2bbSzoQFPv+6HasHCRZo1NPTvBsqlAYkVGd+c5YXft4lovZOCEVgYAPrURdEWN+UrwlX+i0gFbEPHy42Hd9A5Y6dpieExA8AtnrlImzZuuv7MG89Kns0epDSpUF5ymlSfPqu3NLXiro4uJEoiZGQl8TAbBl9nLdb9nnPWP/hnNNpv/aEmBwsoXzSsf/ixO23CBL21pgZ7XC7U29mJkvPyeM706RrTdaTKMsxesUKtOnyYlO4tJMe++ILWnTplPCvKXj+a/5OfKMP9nZEKeeTRRx685F0r4TDHpsECuwatKkZn5X6+rAOg416CPnAKwAFBnpkBHczyerwe1NXrRilRg5lUkGSGuVOv1Jpam/CpYxW4sbkJp6XE8K6WFvTZ+u3UYEUrlk1lUXaKmNKHjNBkWL+hfMHq4FJIFDeHJzO/I5I7rFFcModwTCVAaGQllb+vD5Xv20cUWUbhCQk8PT8/kMsQxkAFAQRJgsjkZJ4+caIen53NyvftDXhPQ1k5zp42jRmedX6spjP1uKb4NKkpqSQJWSnDDulDyTcDcl4clMMiuwZTrTpUywS1qf3alzlC+z0EbXAJEEwAskwccP8tkQpw4PQJmp8+ehAZ0FU/0rwuPHF0Ktu4fhdtb3Ghiuqj5Mi+MtLb44P8/Ex2zdKZekRcPJNskdzsSGBSeBLQkEguBYVyIyz5MSAOHCxIuKRHlJ49Szbs20vzM7OGVJDZYoGDn20UetrbUUh4OB9/1dyL6LmR7AVRhLD4+ADbaqmpIc7mZkRFAfIun6UbrNHd5sR/eeZP0qY3PhZVv4KyC8Ywk8X8rUKa09mDyOpHVz+EYJg1TKzIYZlDhRwzQ2U+DO5zxY+HIbS9h6KtPRSiBQ6pErOagmD3yf3CqJhYBv5uJLuasa+zjhjfap8LYSYjn09BJ05UY38fApfTE0jGVy2Zo8+99lrVGhbNBbONYyoCRwAekLEI1IhcqAcUsIEIGA097+6+PvT+jm10zZbNYmFJMb32sssvUrY52MbLCgtpV1MTtoSE8OQxY1iwwzGkIjEhAVA8LieqOXaMGDnN2dKMQuOS+eY164UjW4uopmpgtlpgysLLtJEA0tXZjXZuP0QLdx2lhTuPUnL7w//1uB80qnCNqKATDXSsAwt8WEAVAUOBQaClSowvD9MgWuSo1Eegr5/dgFNDaJObst2d1GdvBQ+uB6W3C9swAFP9BgsCTyPBlR8INDghik9ZPEX7y5pPhd5uT3+K4ADl1afx6aoqgnXCo2MjDUdAohDwBOQHDenAgQICE6KXXHRdWyu+66UXTa1OJ3L29KAD5aV088GDdMn0GYOAaa+rww3lZdhYYExaOovNyLhkuBFNJhAlCYrWrxdURYGM/Im8rakXb39/k6j4++l1xvgcPW1slm4bosOgKioi5OIe7PEjFfSeu18w7dl1lBQXVxLyy9X3PwLAkaF8nTOscR2rXCcq14gBkp+r1McVaoAmwwXQVFCxmsG4fylmml1DtJJh5O2fB25jSNwMNLLLgWocXSh13GjNFBrHTGFJ3FkWhus/l0jrfoHYk0MYiZDZ4aJjgZlijEH3MzhTWou3b9tNv/h0u9Da1I462jsx6BxUzHA39+MwHBTIGWgID+nz+9HKZ582n21tQSEWCxCEoayuFkuiAJsO7KfXzZo9AIrs9aKKoiLq9XhQWGwcz5o8+RtrLYs9FLa/s0b09vQgR1IuP328irTXtwYmYYSxmJQ4NuuH8zRjHYPAkBV0eOs+WvjpDuFMcSXJLrgQxnt7Pei9NZsEwyCjohychpFgHzcA4RzpwALAGGbJzoHEODOsEjGmIl3XkKxriDMNgJ0zJgkAbrRA9zJgQi1GtJQh7GRA3AwktwVP2+0A0ocluN6soiCqJ/+Aar52HZ352EtP/rZbnLn4Gu116R2Q/TIYVDchOZ53dXahjo4uVFVRg2qq6gRbSDAIgsBHF4xikYlRECIGsYSkOHbTj5epX114eV0d/t3HH4kHy8twVGgoXzl/oepXZFRUeoqU1tbicJuNX7P6QfOGJ34d6Bul5OXpUlAQd7a04PaGemwwLEwuzdQ6GxtRZFISa6iowBXHzxB3h2fAIozwGZ+eyAgd/L6uaahk71Hy0e/+LLo7nGjczAK9vbEVR8ZHBxSYkhrPgm0W6O3xQHZOCgvQXgSIE4Q4Odf8ZbqKmHyO9/s8CORehAw2hQlwghE3XI9ShCQLIMEEnAoILALwsYC0LA6o2o/VZhXBhakRONJJeLLEIUVisbcSZp1u5s27ZNzdoYsLZ1/D129ei8IiQ2HZzVdrY/Pz9C837iL7iw7T4pOncK+nF3SVoV2b9pBz8ZPExEXxlLREPmP2lIDFf35gP91fVkbW7twRWNNPF1+tLpoyVctKSGQb9xfRv+7YJhyvqsbFZ86QRQ/eZzYJIqx77AlfeHw8b6+rA6/Ljdpqz6KYtPRLA9LQgP1eGVNLLLQ3dCEiUAgOtfFeVw9SFRXyZkzQOecIGdo6J2UHSsiudVsFV1tXALzOpnbkiAofuB8UZOJJSTHsVEk1tljNfKAO0bxuJPd0YCZ7QFflwbEAGS5pYVSycmKy9Bdd4sWJK+BpQRyxMUGI2f2Eb3RT1iRjZscQ+HRzxBoUoqdK2JImsoQwkbtOIzQ/bSHauO0TqCw7g6rO1gljZo0nt9x/E5/fMJd1tnaxrVu24d2FRViQKchumdvDQ/m4SaNZfGLsQMw/Xl2NX97wSaCzcOWEfH1Sdo4eG96/8EVTp2kp0TF8zRdbaGFJMTlUXk6SoqL40tUPmW/JydFPHzxIep1dqKOuHhu5ZCgwFJ8PudraUFujE0CKAoOeZ03I1XvdvcgAJHl0OpOCTPyrYBh5Y/fHX9Dqk6cHkkfqmAwme/1AQ6wDY0dE2jmlBAySMwCIr7Me60r/BlN/yyH4XMsheKDlcCnLuYDbVzwtyarD7VbFublB4M83ixGN5n6QKQIWgpGWJRLrqnDVlGrRGouCxDlTfgBbCjfA/u0H0bipY1BsUjREJkQGPtkF2Xy5awUrLz2FXW43yk3NYjaLXY9NjQvM6dE1b0trd/bXMIbUtrbiVc89a7pp7lxtYmaWPm30aH1USor+6C0r2RufbxR2HT9OjlZWkoTISIjKzAy8ZNQYXS1NQ9I2w+q7mpvxhhf/KOnYDlyngAmGuTcvUdf+z9ui4bXRSbEMfyVpO1s68OFt++mx7QcpYxcwjstIZJgOzjEhocEcYWSEtwuVelBUOtOVPvRNLYdvI6Hz47Xf+L8kd8Ai3fSyU0QNCsJdOohFPoCiBsGUa2azfxwjNx9YKGxFn+GK4koo/rKUjc8dpcYlx3Ijh3VzGcc7IlHCZXOgtqWWvPvpuzg82EHC4lbxurOtcKCslHR2dyNJEEBWVejs6UbdfX3wm48+FCbn5JJTtWe1pTNmaulxcezua69Txqal0063W4sOC2N58QlMU1XJsH5XazvWVBVR4UJ9425txWeLT+Kta94Te7oxAAkCk8UEly29UqWUgiCJIJokkEwSxCTHDWj+8JdFdPe6LwNgGIAZxhKbksCCQ2zcbAkapF97iI1zxkFVvwIIkYIMTxgxEJqmIUWRwWQ2B/YBvn7fcOGUmAS9LMrJxm/J8sJaJ0Uvt4kGRQ7cL/Nh83/VSleOYmx/yjy+teZztO3DIpqXOZYl/Xu84gUdSYgyG5ICY+fFZcOvbn0I/fb9F8U7H7td+vmNv9B+MGWqRgkmo1PSWOK5Crqj243+un0bLampwW1Op2C3BvPwkBBut1r57HHjNb+iIJMoBp6NTc9g9WWlgb5Vxb59xGwLDjibr6cHVR49Qkr3HqCNZ9oRI47AmrInjtKvvHGRWl9Rg1W/ElB4dGp/R8JgVDXFVXj7B5uFjsZWRAUKcWmJrKGyFltCgweeG2S0jmCuaTp0dLjRt96gamquxzV1lbiu4Qzu9fQEek2jcsbpM6ddXPFmxCSxisYaMj4lW+c/ClP50lAN/alDQGvaRThHlZNLrfgOdTJsg81Q110FO18rFTLiciF6sV0NDVC5C2IxW/jDqx6Qj5Yf017839dMyZHJ7OW77pLjI6I5wTjAJQzLnFcwSVv91pvSieoq/NR770qjklPYtFGjApTzPBhGkZcxcaJuAHJ400Z65thREhYbywxq21pTgxW/H7gQDiBFAGgA6eOy2Jzli9Ww6HBeX1EDzWcbMMIYsieO1o2xakqq8MY3PhI7m9pQXGoiS8xNZXKfDzXXNIDVZuUpo9IvotbWYAs35tvY0IpHDIgs+1HRoZ1ky/YNwqGjhcTg3F5fHwhUAJstlL79/kui2+1C69/b23f+nfSYRLb56B6BMYYC+woWzPndUQq/0aGhV9oF9JFTAI1DPA6HO61LYJ9SBll9Eqp6WxWZLkP4UvNAM89YtNbrDWwq5edM0F9Lf9H3zs614h3P32G+/d9+Ji+csSBgEAYwk3Ny2Vv33Odf8vADZpfHg0prz+LzgJwXhDEffflM/diXW6nhIT2dncjV0kI0tZ9Rh8YmgrvPAaqqB0LVgpVLlYzx2ToiGOoqzgaSRmJWClN8MrTWt6AtazaIJfuOB/Qy6/p5qiMyjG949QNR13TInjR6yDqHkP6c0ufxjXwLd/e+L+hTL9wnGbUKZwySElKZzRbKGdMR5wxOlZ/AJlMQLLhuomXzR0cCoJhFE3cEh/BGZytKDI+9ENYiBcYfi5P5reEqfqFVjNgK9PbgxbCSXQWh2AYdjZ3Q/rwulLQSGP0zq6r7ZJA73Ght0R5KMYYFs2ZqEdGRbNXcH8lTxkwmz7/8tLh53xf0wVX3KTHhMQwjxH2KjBy2EN7mdiNXby/6aqg6L9lTp+k3PfFkgFqWHzxANFmBiIR4rnET1Fc246KNhTQkzM4nzJmi5V85dSACNFfVYyMkmS0m3tXcjnd/vJWUHjxJ7JEOnj9nijb96iu06uMVpP70WWxU6Xkz8jXDoNDXNrvCwvsre5NJHBkgew9spy+/8YyoqDJkpY9iebkT9BXX/SxgSsHBIbyqphxXnynDr7/zG8lsDoJf/PIG86v/80GgCBudmKl3ezwIwocYOFli7KUkP5z0EvPzraL5kId0B2lg92GIcvaiHesEcX9tHx51i6Z+VnKIvFu0mxoV+JSCCbqDhSOKMc+ITmWvPvYHecPmdfhHq1eafrzkNvX6uddpvV4fMkKWseIIu50L9OIlU1HkebNmabqqotGzZg0o/Oi2/XTLn7cGqHTa2Gw29QcXemItNY2YCJQznYGz3Ykrjp4i+zftoUzXwajWZy+bp5otZn5qf7+3ZBeM0o0iEWF8UQ6x220BQPx+ZfiAtLY34z+vfVXs6GxFGWk57NYVdypjR0/U7SFhA2iPG12gJ8ansNr6avy/Wz4UZNmPiw7vpNMKZmtTssZelFsukrFBOnsv1afscgv6HxpF03GGmBUBMzPecUwjR52AwhaE6iUNdThIkqCspQmlJScFXjVzynuxjm5YdKM2u2C2/uQbgR1KQQhOZ8FBQZAUFc1iwhxGjrkkcSHC4O7x2bJq4u5wIUd0OJ+yaKaamZ87EHIwJeBs68RG7He2dKBDW/ZRURLBeOaqHy1SI+KimJHga09VYSO82qPC+aWajj6fjELswdDt7h3+uawt2z6hJWXHcbDVBjff8AtlXN6kQWCcl5LSo2TfwZ1U13XIHzdVb2ysG/HZL8/lJk16M8Xv/Y1d9r4e4st7AMnmCOC9tYCb1lmFnLhk3ifLUFRWSsi5VofB5ixIZF5QcGxULH/toVf8YRGZbPOBPdQn+yEhMpzPL5j8t43inCiygkxBZj7u8on6vFuWqDkFeV/bRtCgtrQ6sDZN1cDn8ULWxFx90aofKmExEYE51ZaeCTQuRZMIklniBkhD/ZaRr0JDgwPvDEtZBotqbmkIDD4+b7KeGJ/KQ2wXb2NWVpeS519aLXW52tGkCTP0tORMtmzpyhHtrnlVGcttLqy3uriWjXUWhnlQFGKTHpZke47E7N1RkN6aiwzL3HbkMH3mr38R21wuw1IRAcwtIDKPz4c+2rVTKGvsxF4VQ5BIQHaXQXFVybCPvIqSyBf9+IfKv931I2XODQvV4FDboPXWllaTkPB+HRgsKyEjmV21YrGaOTF34ECEv8+HnG1dWPHLkJh96Y0rQig4wvrzyLBCliAI4O5xBdrHxltxMYmDBtd1PVCLPPXCvZK724WyM0axSfmX6cuvXTUiMNSePtTR1Y5CdHLBVggGKSyEW20WNuM57j/6TLcYfiSSFuB8dKrzFPqkcA8tra3FS6ZN1wVKeZ/Ph07VnsVvbf5cYJxDRnwCs5hM8Itl16j3/v5+6YqJs/U7l9+umKXh7VkkZqUMyYwsIcFc9vW3mBIzk9mC25YOCmm6piO/zwftDa1IMkuQMjqDDbDMr49lNfPomDAWiITDmRQCBPljp+rHig+Qvr5e0LQLTVZVU1FXVzt64ZVfSZVnynB8bDJfsvBGdfH8wZ3YvyVM0ZCvzYktCAMFY9IIaHAQSOE2js6FJWJCvGB1iGL6wzxet/ky+mv+LO7sasNfth3GWw4dpFGhobzd5UIIYVA0FQqyc1h2fDx78a67A2dSC3In6r/760vidffdYH7wtvvlaWOmjuho01clLiORzbjmCtXZ2omuWLZAzZk8OKQRSnjFkVKCCYa49ETm7e6DSx0lKpg8St+390Qg+Q9rC5dSCrLih12FW4T2jhbc1tGCszJGM0k0waFjheTD9WuEnYWf0yCzBX5+2z3KSMHoF460Hi9QjgCLAphiwrhot3L0tb0FhBFETZJ0YkKQe3wSblRbUER4CG/ytiFKCAiUotTYODZzzFj9oRU3KbcuWDgwF1EQYeaEy/TMxAz267eelU5Vl+KJuROYSTSNeLZBwRYekxLHx88q0GNS4/jX90B8fT607b3PhK7mDmx404ylV2jBoZc+Guv3K+jokVIy7JOLRkG4s3AzffWt50SMMITY7DwlKZOdrTuNK8+UB2bz33f8Sh6VPZ7lZI75VpbHNB1xVQNiloYVTpp2++mJ3/aIFWolsozizDFP06hI+OTcHGaRzIE2ySXXo8jotY9fFzbu/Zzevfwu5XxB+X1JXfkZ8vGL74nFhcdI9sRR+n+//phfEC99BqCj3YU/+XAbHdFR0qaWenzg8C6yaes6wQhPBpOCQEFjhpuv/7mydNEKdSjm9feUrhKFHH7CLal9HLJXWbW0pUEqAB+yrzaUnK6rxI+99oQUYQ/nD/z4fiXaMTQTGql0d7rwi//xtOnMydN44apr1WX/ebP8t97xeLxoeKdOzoktOIRHRkSDIEi87PRJ4vf7UHRUHP/B3B9qP1v5S8Wo0P9/S1AU4dGTJZ1pCJKuMmuSDfOhtnYvJeH2MH7NrCV6Z3cnevSPj0uSIEJuWs6IxhhKDFrccrYJy14/WrDyGvU8Ff4mEUVh5Iet3d1d6KEn7zAZFDc8PIpNK5it3/nTB/8m+v8MUt/agJ94/SlJYxo88pOH5ZS45O/sLa62LiyaRG7kkeE8P2xAdF1DRoh6+Kk7TUdPFBFHaASfd8XV6jWLVmjhjsjvxc3/UWT9jg3Cq+v+KNx29Up1+fwbvgVB+fby/wIAAP//mC6VL2hDN4cAAAAASUVORK5CYII=
--- PASS: TestCaptcha (0.01s)
PASS

Copy the code

Logs Log printing tool

1. Gotool.logs. ErrorLog Exception Logs

2. Gotool.logs. InfoLog loads Logs

3. Gotool.logs.DebugLog Debug Logs

func TestLogs(t *testing.T) {
gotool.Logs.ErrorLog().Println("Error log Test")
gotool.Logs.InfoLog().Println("Info Log Test")
gotool.Logs.DebugLog().Println("Debug Log Test")}//out
== = RUN   TestLogs
[ERROR] 2021/07/07 15:58:10 logs_test.go:9: Error log test [INFO]2021/07/07 15:58:10 logs_test.go:10: Info Log Test [DEBUG]2021/07/07 15:58:10 logs_test.go:11: Debug log test -- PASS: TestLogs (0.00s)
PASS
Copy the code

PageUtils pagination tool

1, gotool. PageUtils. Paginator rainbow paging

func TestPage(t *testing.T) {
paginator := gotool.PageUtils.Paginator(5.20.500)
fmt.Println(paginator)
}
//out
== = RUN   TestPage
map[AfterPage:6 beforePage:4 currPage:5 pages:[3 4 5 6 7] totalPages:25]
--- PASS: TestPage (0.00s)
PASS
AfterPage next page beforePage previous page currPage current page pages totalPages totalPages
Copy the code

IdUtils

Id generation tool, can generate string ID and int type ID, according to the need to select their own generation rules

1, gotool. IdUtils. IdUUIDToTime according to the rules of time to generate the UUID, into the elimination and true “-” false retain a “-“

func TestUUID(t *testing.T) {
time, err := gotool.IdUtils.IdUUIDToTime(true)
if err == nil {
fmt.Println("Generate UUID removal based on time --------------------->'-'----->", time)
}
time, err = gotool.IdUtils.IdUUIDToTime(false)
if err == nil {
fmt.Println("Generated according to time does not remove --------------------->'-'----->", time)
}
}
//out= = = RUN TestUUID UUID removal was generated according to time -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - >The '-'-----> 6Fb94fe4dfd511ebbc4418c04d462680 generated according to the time don't remove the -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - >The '-'-----> 6fb9c783-dfd5- 11eb-bc4418c04d462680
--- PASS: TestUUID (0.00s)
PASS
Copy the code

2, gotool. IdUtils. IdUUIDToRan according to random Numbers generated by the UUID is recommended to use this method, and there will not be repeated, and eliminate “-” true or false retain a “-“

    time, err := gotool.IdUtils.IdUUIDToTime(true)
if err == nil {
fmt.Println("Generate UUID removal based on time --------------------->'-'----->", time)
}
time, err = gotool.IdUtils.IdUUIDToTime(false)
if err == nil {
fmt.Println("Generated according to time does not remove --------------------->'-'----->", time)
}
//out= = = RUN TestUUID UUID removal was generated according to random number -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - >The '-'-- -- -- -- -- > cf5bcdc585454cda95447aae186d14e6 according to random number generation don't remove the -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - >The '-'-----> 72035dba-d45f- 480.f-b1fd- 508.d1e036f71
--- PASS: TestUUID (0.00s)
PASS
Copy the code

3, gotool. IdUtils. CreateCaptcha generated random number id, type int, into the int refs 1 to 18, after more than 18 will cause more than the length of the int

func TestCreateCaptcha(t *testing.T) {
captcha, err := gotool.IdUtils.CreateCaptcha(18)
iferr ! =nil {
fmt.Println(err)
}
fmt.Println(18 "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - >", captcha)
captcha, err = gotool.IdUtils.CreateCaptcha(10)
iferr ! =nil {
fmt.Println(err)
}
fmt.Println("Ten -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - >", captcha)
}
//out
== = RUN   TestCreateCaptcha
18A -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- >492457482855750014
10A -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- >2855750014
--- PASS: TestCreateCaptcha (0.00s)
PASS
Copy the code

Gotool.idutils.GetIdWork calculates the id length of INT64 from the timestamp to 16 bits

func TestGetIdWork(t *testing.T) {
work := gotool.IdUtils.GetIdWork()
fmt.Println(Int64 type id-------->, work)
}
//out== = RUN TestGetIdWork is calculated based on the timestampint64Type id -- -- -- -- -- -- -- -- >1625746675366450
--- PASS: TestGetIdWork (0.00s)
PASS
Copy the code

HttpUtils

A simple “HTTP request” package for Golang GET POST DELETE PUT

How do we use HttpUtils?

resp, err := gotool.HttpUtils.Get("http://127.0.0.1:8000")
resp, err := gotool.HttpUtils.SetTimeout(5).Get("http://127.0.0.1:8000")
resp, err := gotool.HttpUtils.Debug(true).SetHeaders(map[string]string{}).Get("http://127.0.0.1:8000")

OR

req := gotool.HttpUtils.NewRequest()
req := gotool.HttpUtils.NewRequest().Debug(true).SetTimeout(5)
resp, err := req.Get("http://127.0.0.1:8000")
resp, err := req.Get("http://127.0.0.1:8000".nil)
resp, err := req.Get("Http://127.0.0.1:8000? id=10&title=HttpRequest")
resp, err := req.Get("Http://127.0.0.1:8000? id=10&title=HttpRequest"."address=beijing")

Copy the code

Set the request header

req.SetHeaders(map[string]string{
"Content-Type": "application/x-www-form-urlencoded"."Connection": "keep-alive",
})

req.SetHeaders(map[string]string{
"Source":"api",})Copy the code

Set Cookies

req.SetCookies(map[string]string{
"name":"json"."token":"",
})

OR

gotool.HttpUtils.SetCookies(map[string]string{
"age":"19",
}).Post()
Copy the code

Setting timeout

req.SetTimeout(5) //default 30s
Copy the code

Object-oriented mode of operation

req := gotool.HttpUtils.NewRequest().
Debug(true).
SetHeaders(map[string]string{
"Content-Type": "application/x-www-form-urlencoded",
}).SetTimeout(5)
resp, err := req.Get("http://127.0.0.1")

resp,err := gotool.HttpUtils.NewRequest().Get("http://127.0.0.1")
Copy the code

GET

Query parameters

resp, err := req.Get("http://127.0.0.1:8000")
resp, err := req.Get("http://127.0.0.1:8000".nil)
resp, err := req.Get("Http://127.0.0.1:8000? id=10&title=HttpRequest")
resp, err := req.Get("Http://127.0.0.1:8000? id=10&title=HttpRequest"."address=beijing")

OR

resp, err := gotool.HttpUtils.Get("http://127.0.0.1:8000")
resp, err := gotool.HttpUtils.Debug(true).SetHeaders(map[string]string{}).Get("http://127.0.0.1:8000")
Copy the code

multi-parameter

resp, err := req.Get("Http://127.0.0.1:8000? id=10&title=HttpRequest".map[string]interface{} {"name":  "jason"."score": 100,})defer resp.Close()

body, err := resp.Body()
iferr ! =nil {
return
}

return string(body)
Copy the code

POST

// Send nil
resp, err := gotool.HttpUtils.Post("http://127.0.0.1:8000")

// Send integer
resp, err := gotool.HttpUtils.Post("http://127.0.0.1:8000".100)

// Send []byte
resp, err := gotool.HttpUtils.Post("http://127.0.0.1:8000"And []byte("bytes data"))

// Send io.Reader
resp, err := gotool.HttpUtils.Post("http://127.0.0.1:8000", bytes.NewReader(buf []byte))
resp, err := gotool.HttpUtils.Post("http://127.0.0.1:8000", strings.NewReader("string data"))
resp, err := gotool.HttpUtils.Post("http://127.0.0.1:8000", bytes.NewBuffer(buf []byte))

// Send string
resp, err := gotool.HttpUtils.Post("http://127.0.0.1:8000"."title=github&type=1")

// Send JSON
resp, err := gotool.HttpUtils.JSON().Post("http://127.0.0.1:8000"."{\"id\":10,\"title\":\"HttpRequest\"}")

// Send map[string]interface{}{}
resp, err := req.Post("http://127.0.0.1:8000".map[string]interface{} {"id":    10."title": "HttpRequest",})defer resp.Close()

body, err := resp.Body()
iferr ! =nil {
return
}
return string(body)

resp, err := gotool.HttpUtils.Post("http://127.0.0.1:8000")
resp, err := gotool.HttpUtils.JSON().Post("http://127.0.0.1:8000".map[string]interface{} {"title":"github"})
resp, err := gotool.HttpUtils.Debug(true).SetHeaders(map[string]string{}).JSON().Post("http://127.0.0.1:8000"."{\"title\":\"github\"}")
Copy the code

The proxy pattern

proxy, err := url.Parse("http://proxyip:proxyport")
iferr ! =nil {
log.Println(err)
}

resp, err := gotool.HttpUtils.Proxy(http.ProxyURL(proxy)).Get("http://127.0.0.1:8000/ip")
defer resp.Close()

iferr ! =nil {
log.Println("Request error: % v", err.Error())
}

body, err := resp.Body()
iferr ! =nil {
log.Println("Get body error: %v", err.Error())
}
log.Println(string(body))
Copy the code

Upload a file

Params: url, filename, fileinput

resp, err := req.Upload("http://127.0.0.1:8000/upload"."/root/demo.txt"."uploadFile")
body, err := resp.Body()
defer resp.Close()
iferr ! =nil {
return
}
return string(body)
Copy the code

Alert mode

The default false

req.Debug(true)
Copy the code

Print to standard output:

[HttpRequest]
-------------------------------------------------------------------
Request: GET http: / / 127.0.0.1:8000? name=iceview&age=19&score=100
Headers: map[Content-Type:application/x-www-form-urlencoded]
Cookies: map[]
Timeout: 30s
ReqBody: map[age:19 score:100] -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --Copy the code

Json

Post JSON request

Set the request header

 req.SetHeaders(map[string]string{"Content-Type": "application/json"})
Copy the code

Or

req.JSON().Post("http://127.0.0.1:8000".map[string]interface{} {"id":    10."title": "github",
})

req.JSON().Post("http://127.0.0.1:8000"."{\"title\":\"github\",\"id\":10}")
Copy the code

A Post request

resp, err := req.Post("http://127.0.0.1:8000".map[string]interface{} {"id":    10."title": "HttpRequest",})Copy the code

Prints formatted JSON

str, err := resp.Export()
iferr ! =nil {
return
}
Copy the code

Unmarshall JSON

var u User
err := resp.Json(&u)
iferr ! =nil {
return err
}

var m map[string]interface{}
err := resp.Json(&m)
iferr ! =nil {
return err
}
Copy the code