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 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
--- 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