找回密码
 加入怎通
查看: 212|回复: 1

Go工具集-String工具,时间工具,http工具等(go string转int)

[复制链接]
我来看看 发表于 2023-03-09 19:02:26 | 显示全部楼层 |阅读模式
' Q! h& t i3 v' f( i8 Y4 H8 y

gotoolgotool是一个小而全的Golang工具集,主要是将日常开发中常用的到方法进行提炼集成,避免重复造轮子,提高工作效率,每一个方法都是作者经过工作经验,和从以往的项目中提炼出来的2021-7-9更新内容详细使用请看文档。

: Q2 q6 F; v7 X; h5 `( E6 I

添加文件IO操作工具FileUtils添加验证码生成工具CaptchaUtils添加文件目录压缩和解压缩工具ZipUtis字符串数组工具StrArrayUtils如何使用gotool呢?安装go get

X7 {- y8 \" k8 d6 }+ \

http://github.com/druidcaesa/gotoolgo.mod http://github.com/druidcaesa/gotool引入import"github.com/druidcaesa/gotool"

9 ]2 x9 B' t8 g! ?$ z6 E

StrUtilsgolang一个string常用工具集,基本涵盖了开发中经常用到的工具,目前正在不端的完善中1、gotool.StrUtils.ReplacePlaceholder 占位符替换funcTestStringReplacePlaceholder

/ r- B- c( D* ~ n2 J# d/ ]/ r

(t*testing.T){s:="你是我的{},我是你的{}"placeholder,err:=gotool.StrUtils.ReplacePlaceholder(s,"唯一","所有")iferr

2 X# `$ u$ T: c& }# H" t- D( [

==nil{fmt.Println(placeholder)}}//out , A+ B# o0 C7 _- p ===RUNTestStringReplacePlaceholder你是我的唯一,我是你的所有---PASS:TestStringReplacePlaceholder

8 @0 b1 L3 k8 I! q/ {

(0.00s)PASS2、gotool.StrUtils.RemoveSuffix 去除文件扩展名获取文件名funcTestRemoveSuffix(t*testing.T){fullFilename:=

& w' K* r; t% P( N7 H V0 C

"test.txt"suffix,_:=gotool.StrUtils.RemoveSuffix(fullFilename)fmt.Println(suffix)fullFilename="/root/home/test.txt"

+ W* |, I: W$ o" N6 g/ z% Q

suffix,_=gotool.StrUtils.RemoveSuffix(fullFilename)fmt.Println(suffix)}//out 4 b* R* H5 r! b$ N4 a1 V w ===RUNTestRemoveSuffixtest

' t/ P1 l' N2 }; J) y8 X& h: o; C

test---PASS:TestRemoveSuffix(0.00s)PASS3、gotool.StrUtils.GetSuffix 获取文件扩展名funcTestGetSuffix(t*testing

- Z( w4 X) I, f1 d: Q% M

.T){fullFilename:="test.txt"suffix,_:=gotool.StrUtils.GetSuffix(fullFilename)fmt.Println(suffix)fullFilename

' G; x2 o: X0 w; y& r& t* t# Y

="/root/home/test.txt"suffix,_=gotool.StrUtils.GetSuffix(fullFilename)fmt.Println(suffix)}//out+ y5 t1 F( q) B# d0 M: S ===RUN

5 B: w, M o( H0 t; }

TestGetSuffix.txt.txt---PASS:TestGetSuffix(0.00s)PASS4、gotool.StrUtils.HasEmpty 判断字符串是否未空,我空返回turefunc

8 ?* Q+ `0 K, h8 f5 V5 i

TestHasStr(t*testing.T){str:=""empty:=gotool.StrUtils.HasEmpty(str)fmt.Println(empty)str="11111"empty

. i9 `5 w$ W! ~ n! u7 P

=gotool.StrUtils.HasEmpty(str)fmt.Println(empty)}//out6 C7 u1 M: o& M ===RUNTestHasStrtruefalse---PASS:TestHasStr(0.00

c0 d+ f3 O; g& k' ]4 L

s)PASSStrArrayUtils string数组操作工具1、gotool.StrArrayUtils.StringToInt64 字符串数组转int64数组,调用前请确保字符串数组均为数字func

( j# Q! D7 ?# {& V; v$ j

TestStringToInt64(t*testing.T){//字符串数组转int64 " C6 V* L/ r* y A strings:=[]string{"1","23123","232323"}fmt.Println(reflect

, l/ c+ D5 Q0 n4 k7 V4 \6 y4 K2 K1 ^

.TypeOf(strings[0]))toInt64,err:=gotool.StrArrayUtils.StringToInt64(strings)iferr!=nil{t.Fatal(err)}fmt

: l1 c( q: [ G# P2 q1 [# [

.Println(reflect.TypeOf(toInt64[0]))}//out 8 c1 e! H& h% j" S ===RUNTestStringToInt64stringint64---PASS:TestStringToInt64

3 |0 ^# [- x% u0 e! m# N8 V

(0.00s)PASS2、gotool.StrArrayUtils.StringToInt32 字符串数组转int64数组,调用前请确保字符串数组均为数字funcTestStringToInt32(t*

8 H9 t9 P% w3 Q5 I* N

testing.T){//字符串数组转int64 / k) m7 Y( {+ b strings:=[]string{"1","23123","232323"}fmt.Println(reflect.TypeOf(strings[0]))

7 {3 {4 @* t; N9 A' ^/ d

toInt64,err:=gotool.StrArrayUtils.StringToInt32(strings)iferr!=nil{t.Fatal(err)}fmt.Println(reflect.TypeOf

7 C8 ?; m- {. p0 [

(toInt64[0]))}//out % @0 U( N8 i1 c" c ===RUNTestStringToInt32stringint32---PASS:TestStringToInt32(0.00s)PASS3、gotool.StrArrayUtils.ArrayDuplication 数组去重

9 S3 g8 {- e( q( s; Q' k: V

funcTestArrayDuplication(t*testing.T){//string数组去重2 F. k' M. v4 b* p4 Y( S strings:=[]string{"hello","word","gotool","word"}fmt

, y" O4 r3 g( t, X) Y5 E. P

.Println("去重前----------------->",strings)duplication:=gotool.StrArrayUtils.ArrayDuplication(strings)fmt

7 [, } W& x" R- w+ K, Q2 u

.Println("去重后----------------->",duplication)}//out1 y4 h! [ P- l( g8 ^3 _9 A ===RUNTestArrayDuplication去重前----------------->[hello

3 [- n% }1 ]. k( \

wordgotoolword]去重后----------------->[hellowordgotool]---PASS:TestArrayDuplication(0.00s)PASSDateUtilgolang一个时间操作工具集,基本涵盖了开发中经常用到的工具,目前正在不端的完善中

# w6 \/ o- ~% S/ u3 [3 \

1、gotool.DateUtil.FormatToString 时间格式化成字符串funcTestFormatToString(t*testing.T){now:=gotool.DateUtil.Now

: ^8 \( O" y; [

()toString:=gotool.DateUtil.FormatToString(&now,"YYYY-MM-DD hh:mm:ss")fmt.Println(toString)toString=gotool

' i0 _( B6 w7 v+ k; p7 x9 K

.DateUtil.FormatToString(&now,"YYYYMMDD hhmmss")fmt.Println(toString)}//年月日对应YYYY MM DD 时分秒 hhmmss 可进行任意组合 比如 YYYY hh YYYY-DD hh:mm 等 0 M* X9 o% O- b

3 U% I% W; T+ \5 ?

//out1 {5 K: [, \ ]) T9 [2 s: a) H ===RUNTestFormatToString2021-07-0716:13:3020210707161330---PASS:TestFormatToString(0.00s)PASS2、gotool.DateUtil.IsZero 判断时间是否为空

% F9 l( d+ C) s7 _5 P

//时间为空 true 否则 false $ s) P' ^! O1 o ^+ s funcTestDate_IsZero(t*testing.T){t2:=time.Time{}zero:=gotool.DateUtil.IsZero(t2)

; `% ^/ z+ s2 n

fmt.Println(zero)zero=gotool.DateUtil.IsZero(gotool.DateUtil.Now())fmt.Println(zero)}//out - d3 C) j0 ~' Y" o9 S0 P ===RUNTestDate_IsZero

0 t, X- s: o4 p+ E! \

truefalse---PASS:TestDate_IsZero(0.00s)PASS3、gotool.DateUtil.Now 获取当前时间 等同于time.Now(),为了统一化所以将此方法也纳入到工具中

6 C7 ]* X9 Z6 Z" V2 b9 `# s4 ^+ w

4、gotool.DateUtil.InterpretStringToTimestamp 字符串格式化成时间类型//参数一 需要格式化的时间字符串 参数二 字符串格式,需要和需格式化字符串格式一致: Y: W5 o. b0 r4 }; \9 S+ { //如 2021-6-4 对应YYYY-MM-DD 2021.6.4 对应YYYY.MM.DD& V5 l$ V& u" ?. X1 E/ U2 a( C

4 |- W0 @& X1 A0 G! ?# U w, L( u

funcTestInterpretStringToTimestamp(t*testing.T){timestamp,err:=gotool.DateUtil.InterpretStringToTimestamp

: }) ]/ c4 F7 f' y

("2021-05-04 15:12:59","YYYY-MM-DD hh:mm:ss")iferr!=nil{gotool.Logs.ErrorLog().Println(err.Error())}fmt

4 F3 {. M7 ?5 m ]: Y0 T

.Println(timestamp)}//out; T3 |% a/ P% n" o' _8 N8 D ===RUNTestInterpretStringToTimestamp1620112379---PASS:TestInterpretStringToTimestamp

+ H7 R5 h3 G3 B5 K' L

(0.00s)PASS5、gotool.DateUtil.UnixToTime 时间戳转时间funcTestUnixToTime(t*testing.T){unix:=gotool.DateUtil.Now

! R' a# s7 @, L

().Unix()fmt.Println("时间戳----------------------->",unix)toTime:=gotool.DateUtil.UnixToTime(unix)fmt.Println

[0 r: v' E' F! {

(toTime)}//out # ~8 o7 q4 l* N ===RUNTestUnixToTime时间戳----------------------->16256456822021-07-0716:14:42+0800CST---

' @0 `% x( Z G# A( e& @% {

PASS:TestUnixToTime(0.00s)PASS6、gotool.DateUtil.GetWeekDay 获取星期几funcTestGetWeekDay(t*testing.T){now:=

0 }% e* B3 ^: c3 Z* U5 o

gotool.DateUtil.Now()day:=gotool.DateUtil.GetWeekDay(now)fmt.Println("今天是-----------------周",day)}//out: f$ C$ W$ [# j6 T

: A: y8 u1 T$ J1 p/ J+ T) W1 u% B

===RUNTestGetWeekDay今天是-----------------周3---PASS:TestGetWeekDay(0.00s)PASS7、gotool.DateUtil.MinuteAddOrSub,HourAddOrSub,DayAddOrSub 时间计算工具

# G% y( V! H; q9 a

//时间计算 4 \6 x! I3 Z5 N, x3 | funcTestTimeAddOrSub(t*testing.T){now:=gotool.DateUtil.Now()fmt.Println("现在时间是--------------------->"

0 A" L/ e: l% a9 n! M+ d4 [

,now)sub:=gotool.DateUtil.MinuteAddOrSub(now,10)fmt.Println("分钟计算结果-------------------->",sub)sub=gotool

) g; }5 ?5 {) v" x9 r3 E, j

.DateUtil.MinuteAddOrSub(now,-10)fmt.Println("分钟计算结果-------------------->",sub)sub=gotool.DateUtil.HourAddOrSub

6 Y+ u2 i! f* s' m$ A% E1 o3 D8 A. l

(now,10)fmt.Println("小时计算结果-------------------->",sub)sub=gotool.DateUtil.HourAddOrSub(now,-10)fmt.Println

1 C' ~: w# A9 ` r1 Y" @" X

("小时计算结果-------------------->",sub)sub=gotool.DateUtil.DayAddOrSub(now,10)fmt.Println("天计算结果-------------------->"

/ h* J5 U! ^2 `; B7 j3 e

,sub)sub=gotool.DateUtil.DayAddOrSub(now,-10)fmt.Println("天计算结果-------------------->",sub)}//现在时间是---------------------> 2021-07-07 11:18:17.8295757 +0800 CST m=+0.0122780012 p" i3 }5 o+ S' m+ D# B1 T

7 k+ E) K% ?, @7 n4 B4 O' q3 D8 s. \

//分钟计算结果--------------------> 2021-07-07 11:28:17.8295757 +0800 CST m=+600.012278001 9 ?# c$ {8 e5 q7 C0 S; s! d //分钟计算结果--------------------> 2021-07-07 11:08:17.8295757 +0800 CST m=-599.987721999! X! C' b% ^+ V" o- z) P U

. g8 S3 y# Y7 j, e* ]

//小时计算结果--------------------> 2021-07-07 21:18:17.8295757 +0800 CST m=+36000.012278001; g- v! f' _5 p- x+ [ i( B" f* v //小时计算结果--------------------> 2021-07-07 01:18:17.8295757 +0800 CST m=-35999.987721999' L2 u# h# J+ }% [- N7 w2 G$ W" p

* |) j9 e) Z/ r! z

//天计算结果--------------------> 2021-07-17 11:18:17.8295757 +0800 CST m=+864000.012278001. l6 o/ r' n' I8 |, t5 g' E) A# _ //天计算结果--------------------> 2021-06-27 11:18:17.8295757 +0800 CST m=-863999.987721999 4 K/ r. z4 q: Z2 P6 P8 N( H/ q

0 ?# l/ O( G& j. I# K+ P: g

ConvertUtils 公历转农历工具1、gotool.ConvertUtils.GregorianToLunarCalendar(公历转农历),GetLunarYearDays(农历转公历),GetLunarYearDays(获取农历这一年农历天数)

& ~6 _) B( C5 n! l

funcTestConvertTest(t*testing.T){calendar:=gotool.ConvertUtils.GregorianToLunarCalendar(2020,2,1)fmt.

5 n7 m& l* I6 [ F

Println(calendar)gregorian:=gotool.ConvertUtils.LunarToGregorian(calendar[0],calendar[1],calendar[2],

# _8 _5 A2 r% y. {8 U5 s

false)fmt.Println(gregorian)days:=gotool.ConvertUtils.GetLunarYearDays(2021)fmt.Println(days)}//[2020 1 8]7 {' }, s* a b# Z9 s P% J3 G

2 [; y, Y0 @ E- }: A; G$ a

//[2020 2 1] 9 d7 }: e) x# I //354 ) M9 o( O- l, h7 b* ^8 r) F. r$ N+ c 2、gotool.ConvertUtils.GetSolarMonthDays(2021,7)获取公历某月天数 2021年7月天数3、gotool.ConvertUtils.IsLeapYear(2021)获取某年是否是瑞年 true是 false不是

" k3 r' H. P7 @0 }7 m8 @ o

4、gotool.ConvertUtils.GetLeapMonth(2021)获取某年闰月月份BcryptUtils 加密和解密工具1、gotool.BcryptUtils.Generate 加密处理,多用于密码进行加密后数据库存储使用,不可逆

1 I) v6 f7 ^/ S* R8 E. t

2、gotool.BcryptUtils.CompareHash 加密后和未加密密码对比,多用于登录验证使用funcTestGenerate(t*testing.T){//进行加密, s: S7 m5 p( n1 A0 z5 _ generate:=

5 h7 ^& R, ~9 _+ ]) e

gotool.BcryptUtils.Generate("123456789")fmt.Println(generate)//进行加密对比; [, i }6 E% ]+ G7 o, O hash:=gotool.BcryptUtils.CompareHash

! D9 X' ?: V6 d" ~; d# H

(generate,"123456789")fmt.Println(hash)}//out 3 d% a5 N/ s, }6 ] ===RUNTestGenerate$2a$10$IACJ6zGuNuzaumrvDz58Q.vJUzz4JGqougYKrdCs48rQYIRjAXcU2

/ [. K! V0 o; W' `. e: @$ ?2 t C

true---PASS:TestGenerate(0.11s)PASS3、gotool.BcryptUtils.MD5 md5加密funcTestMd5(t*testing.T){md5:=gotool

5 D5 Z% K5 z0 {% M

.BcryptUtils.MD5("123456789")fmt.Println(md5)}//out0 a% @1 b6 j- j/ c. Q0 E ===RUNTestMd525f9e794323b453885f5181f1b624d0b---PASS

; B8 J3 j7 [9 ^' l, k) \* S

:TestMd5(0.00s)PASS4、gotool.BcryptUtils.GenRsaKey(获取公钥和私钥),5、RsaSignWithSha256(进行签名),6、RsaVerySignWithSha256(验证),

$ L! Q: [: ]* I" y' u" P' }

7、RsaEncrypt(公钥加密),8、RsaDecrypt(私钥解密)funcTestRsa(t*testing.T){//rsa 密钥文件产生% v5 K; t* G& w. F5 X( t fmt.Println("-------------------------------获取RSA公私钥-----------------------------------------"

1 B) l* S7 Y' D* {/ ?8 N

)prvKey,pubKey:=gotool.BcryptUtils.GenRsaKey()fmt.Println(string(prvKey))fmt.Println(string(pubKey))fmt

. H0 Z1 L8 M) S+ E

.Println("-------------------------------进行签名与验证操作-----------------------------------------")vardata=

5 w# f* o2 t- u

"我是被加密的数据记住我哦-------------------------------"fmt.Println("对消息进行签名操作...")signData:=gotool.BcryptUtils.

2 M4 w- ]' N, Q1 Z/ t

RsaSignWithSha256([]byte(data),prvKey)fmt.Println("消息的签名信息: ",hex.EncodeToString(signData))fmt.Println

* l t5 L$ n# } ]& K7 N

("\n对签名信息进行验证...")ifgotool.BcryptUtils.RsaVerySignWithSha256([]byte(data),signData,pubKey){fmt.Println

1 V" {( B" w! b+ B( {! i- F8 [7 F

("签名信息验证成功,确定是正确私钥签名!!")}fmt.Println("-------------------------------进行加密解密操作-----------------------------------------"

4 J- ~9 `4 q1 y- V/ t/ j& U! y

)ciphertext:=gotool.BcryptUtils.RsaEncrypt([]byte(data),pubKey)fmt.Println("公钥加密后的数据:",hex.EncodeToString

3 \# l+ B: ~1 l; L

(ciphertext))sourceData:=gotool.BcryptUtils.RsaDecrypt(ciphertext,prvKey)fmt.Println("私钥解密后的数据:",string

1 @7 w- q1 T1 H6 M: V7 G

(sourceData))}//out 7 p9 \8 Y1 x: v, D ===RUNTestRsa-------------------------------获取RSA公私钥-----------------------------------------

' A. T h/ {. z* e- h1 `/ h! U

-----BEGINRSAPRIVATEKEY-----MIICXAIBAAKBgQCgHh1ZYFjlxrIJYjjWGFaLwC8Oov8KqyMtHa+GauF121dperr3i46JyDoskoSBhbkmqv70LMNrjqVdttdIsC0BtH9ThWLBwKVLH56EqfzqlzClKZEh

( \1 c y2 J! f0 D: l

WTNaddCSuxoZpN33mwS82DCjZe3d7nAPdEGD5pSBx6TVt5bG1c3NVAmcBQIDAQABAoGAWc5KO9T0R3xYYzb6Fer0r9GNEzKMxdkTE7zws

A) S$ O: e! T+ T7 f6 _

/3Cky4BKyIxN6LIwbLSHinXtCXioTOLaDyrJuqNCbEBsr1NoCIPxnswA5Jm5QDYO5x9aq4u8+SZ9KqLbMrO1JDSZV7Cbiblz1xNMfdVIvlVjD5RdEotbYTbHI2CZUoPsjHng8kCQQDHi6TJYJqvej8r

! y, c2 {6 x5 d

q46ZceuWHDgE81Wu16RrA/kZKi6MJAApQtfO/4HM6W/ImbCjZ2rSYxqnAlIg/GxAdT6iJABjAkEAzWra06RyhGm3lk9j9Xxc0YPX6VX7qT5Iq6c7ry1JtTSeVOksKANG

& }- `* q& @* h. B( u$ w

elaNnCj8YYUgj7BeBBcMMvLd39hP1h06dwJAINTyHQwfB2ZGxImqocajq4QjF3VuEKF8dPsnXiOZmwdFW4Sa+30Av1VdRhU7gfc/FTSnKvlvx

5 Q U3 K1 s% [' K2 t. Z3 K

+ugaA6iao0f3wJBALa8sTCH4WwUE8K+m4DeAkBMVn34BKnZg5JYcgrzcdemmJeW2rY5u6/HYbCi8WnboUzSK8Dds/d7AJBKgTNLyx8CQBAeU0St3Vk6SJ6H71J8YtVxlRGDjS2fE0JfUBrpI

, g: w3 Q, q+ W/ h. T( n5 @

/bgr/QI8yMAMyFkt1YshN+UNWJcvR5SXQnyT/udnWJIdg4=-----ENDRSAPRIVATEKEY----------BEGINPUBLICKEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCgHh1ZYFjlxrIJYjjWGFaLwC8O

* E8 e9 ?# \4 y* t# H3 f

ov8KqyMtHa+GauF121dperr3i46JyDoskoSBhbkmqv70LMNrjqVdttdIsC0BtH9ThWLBwKVLH56EqfzqlzClKZEhWTNaddCSuxoZpN33mwS82DCjZe3d7nAPdEGD5pSB

0 o! W9 G6 s2 j5 z. T( e5 H

x6TVt5bG1c3NVAmcBQIDAQAB-----ENDPUBLICKEY------------------------------------进行签名与验证操作-----------------------------------------

7 ^/ r4 G9 Q3 P! q9 o- ^# \% i' h

对消息进行签名操作...消息的签名信息:1fcf20c4fb548c8fc0906e369287feb84c861bf488d822d78a0eada23d1af66ed3a12e9440d7181b1748fd0ad805222cf2ce7ce1f6772b330ef11b717700ba26945dda9d749a5c4d8c108ede103c17bed92801a4c3fbc1ebf38d10bf4bf183713eeb7f429acc3dcc3812366a324737f756720f3f9e75ddda1e024a7698b89163

0 o5 c! ^, q2 `

对签名信息进行验证...签名信息验证成功,确定是正确私钥签名!!-------------------------------进行加密解密操作-----------------------------------------

, Y8 X# L# R0 o/ ~( t4 d

公钥加密后的数据:637b05798c1cf95cfcc63adf228645c77f8e9a9f34b12b722e6938ded8c9560a0430171a4f940d3fb2d96bc6c470c80a817d81f4a2669b991adbff5b22b335129e514c921083ce3e64c1c876409d9b763d5e8e269797283ef951a364da6a59a1d8454391356cb0cd0808092e9dd7ac371f9247a43760f3c82b7ad26a32a7a807

$ g. R- d4 Z+ [ k' D7 d

私钥解密后的数据:我是被加密的数据记住我哦----------------------------------PASS:TestRsa(0.02s)PASSZipUtils压缩和解压工具,可单文件压缩也可进行目录压缩,或者跨目录压缩

& y& S! Z; y# G' A

1、gotool.ZipUtils.Compressfiles 文件数组 可以是多目录文件dest 压缩文件存放地址funcTestCompress(t*testing.T){open,err:=os.

2 c; c4 @, ]& O% t% e8 Q

Open("/Users/fanyanan/Downloads/gotool")iferr!=nil{t.Fatal(err)}files:=[]*os.File{open}flag,err:=gotool

7 `% D" l, q/ X4 V$ f

.ZipUtils.Compress(files,"/Users/fanyanan/Downloads/test.zip")iferr!=nil{t.Fatal(err)}ifflag{fmt.Println

* ]6 H4 `$ U* Q- ~$ |& m% v; ~

("压缩成功")}}//out9 u; @4 w0 v2 y b; i1 g6 b ===RUNTestCompress压缩成功---PASS:TestCompress(0.12s)PASS2、gotool.ZipUtils.DeCompresszipFile 压缩包路径

- M+ L% t: Z# Z# B1 I2 H9 q# D

dest 要解压的路径funcTestDeCompress(t*testing.T){compress,err:=gotool.ZipUtils.DeCompress("/Users/fanyanan/Downloads/test.zip"

' x$ P8 x5 U0 I7 O' Y3 |

,"/Users/fanyanan/Downloads")iferr!=nil{t.Fatal(err)}ifcompress{fmt.Println("解压成功")}}//out 9 s+ e7 d* l* t- O1 O ===RUNTestDeCompress

* ^6 h8 j, i+ r% A+ B

解压成功---PASS:TestDeCompress(0.44s)PASSFileUtils文件操作工具,让做io操作更简单各个方便,让io操作不是那么难1、gotool.FileUtils.Exists 判断文件或者目录是否存在

/ m$ _' j( h- [- u

funcTestFileExists(t*testing.T){//判断文件或目录是否存在 O! F: N2 F3 I4 z exists:=gotool.FileUtils.Exists("F:/go-test/test")fmt.Println

; Y) }9 x% a o- d6 y" n! d3 S7 X

("创建前------------------------>",exists)err:=os.MkdirAll("F:/go-test/test",os.ModePerm)iferr!=nil{t.Fatal

7 @* ?! I% Z& D* ?+ p T9 k/ R4 ]4 D3 ]

(err)}exists=gotool.FileUtils.Exists("F:/go-test/test")fmt.Println("创建后------------------------>",exists

9 {# b9 A }( ^6 h$ Y) w8 L

)}//out / Q1 J+ H$ ?# P. E4 q' m" J2 {& _; u x2 [ ===RUNTestFileExists创建前------------------------>false创建后------------------------>true---PASS:

9 M0 B9 q5 o/ R

TestFileExists(0.00s)PASS2、gotool.FileUtils.IsDir 判断是否是目录funcTestIsDir(t*testing.T){//判断是否是目录 $ c6 ~+ _$ q' ], R! y6 I dir:=gotool

; D2 R, ^+ e( I# N) i8 U' h

.FileUtils.IsDir("F:/go-test/test")fmt.Println("是否是目录--------------------->",dir)dir=gotool.FileUtils

: c; {7 c, M4 v* |. y- F; H

.IsDir("F:/go-test/test/test.txt")fmt.Println("是否是目录--------------------->",dir)}//out/ `$ o+ O, N) E4 b6 Q$ v/ z. D5 u ===RUNTestIsDir

( N7 b, ?* w- p5 y4 \, H4 S9 z

是否是目录--------------------->true是否是目录--------------------->false---PASS:TestIsDir(0.00s)PASS3、gotool.FileUtils.IsFile 判断是否是文件

3 Y- Y: B. B5 l0 P" E

funcTestIsFile(t*testing.T){//判断是否是文件 , ^! S$ i- i2 @% E1 T file:=gotool.FileUtils.IsFile("F:/go-test/test")fmt.Println("是否是文件--------------------->"

) }* x$ _, |( ^9 N: p0 y: X0 o

,file)file=gotool.FileUtils.IsFile("F:/go-test/test/test.txt")fmt.Println("是否是文件--------------------->"

# b4 Q& ^& `6 @2 B4 S% E, [& g

,file)}//out# ~: A$ m5 k/ |- x6 ~; c7 r ===RUNTestIsFile是否是文件--------------------->false是否是文件--------------------->true---PASS:TestIsFile

; v9 x7 Q5 x9 y6 F9 \

(0.00s)PASS4、gotool.FileUtils.RemoveFile 删除文件或目录funcTestRemove(t*testing.T){//删除文件 , L0 Y) {9 E e& o- ~* g9 L file,err:=gotool.FileUtils

$ e9 o) a" O: t7 ]% B4 W9 z

.RemoveFile("F:/go-test/test/test.txt")iferr!=nil{t.Fatal(err)}iffile{//查看文件是否还存在* H1 _9 o! i8 n4 q$ ~ exists:=gotool.FileUtils

8 l4 q3 j: n1 S' G+ y4 Q

.Exists("F:/go-test/test/test.txt")fmt.Println("文件是否存在------------------------>",exists)}}//out; f$ |, z, m) l% W" N7 _ ===RUN

5 D9 {3 O0 i5 I' S

TestRemove文件是否存在------------------------>false---PASS:TestRemove(0.00s)PASS5、gotool.FileUtils.OpenFileWronly 只写模式打开文件,没有将自动创建,写入内从进行测试

( S. k, N# h' T( B" p0 F; o

funcTestOpenFileWronly(t*testing.T){//用只写模式打开一个文件,并且写入5条内容,若文件不存在将会创建一个 `6 V' o3 p! {" ]8 i path:="F:/go-test/test/test.txt"

& U( C* d: J' K! l( H+ O' z6 \

str:="hello word gotool \n"wronly,err:=gotool.FileUtils.OpenFileWronly(path)iferr!=nil{t.Fatal(err)}defer

% b4 A/ A9 c6 R

wronly.Close()write:=bufio.NewWriter(wronly)fori:=0;i<5;i++{write.WriteString(str)}//Flush将缓存的文件真正写入到文件中 ) i* i# z0 h# Y

9 |+ H$ a$ ]; V* E! `

write.Flush()//读取文件写入到控制台1 L o5 S/ {0 }3 K/ r2 s files,err:=gotool.FileUtils.OpenFileRdonly(path)iferr!=nil{t.Fatal(err)}defer

. A, e. k, q: ~. C( @- m

files.Close()reader:=bufio.NewReader(files)for{str,err:=reader.ReadString(\n)iferr!=nil{break}fmt.Print

: S, a* Q% l# r* J8 J: V9 e0 l

(str)}}//out 6 n( E: f% i2 X: i4 S$ q6 y ===RUNTestOpenFileWronlyhellowordgotoolhellowordgotoolhellowordgotoolhellowordgotoolhello

+ K! w- j$ s0 q1 H# Q p

wordgotool---PASS:TestOpenFileWronly(0.00s)PASS6、gotool.FileUtils.OpenFileRdonly 只读模式打开文件,读取内容输出到控制台func

b6 L9 \1 i) A- f1 V# V; x& {

TestOpenFileRdonly(t*testing.T){path:="F:/go-test/test/test.txt"files,err:=gotool.FileUtils.OpenFileRdonly

( Z+ Y* w# G# K. K9 F

(path)iferr!=nil{t.Fatal(err)}deferfiles.Close()reader:=bufio.NewReader(files)for{str,err:=reader.ReadString

5 Y1 o# E3 u) r0 X$ Y

(\n)iferr!=nil{break}fmt.Print(str)}}//out \1 M M' n( Z2 I/ u% a ===RUNTestOpenFileRdonlyhellowordgotoolhellowordgotoolhello

; Z1 k9 K4 G1 l

wordgotoolhellowordgotoolhellowordgotool---PASS:TestOpenFileRdonly(0.00s)PASS7、gotool.FileUtils.OpenFileAppend 打开文件在文件后面追加内容,没有将自动创建文件

4 C: o* s- _" `* ^$ X1 T

funcTestOpenFileAppend(t*testing.T){//打开文件在文件后面追加数据% h2 f) m( A& D( z8 S0 h path:="F:/go-test/test/test.txt"str:="追加内容 \n"wronly

. d8 W6 t' v2 A& C4 C7 i

,err:=gotool.FileUtils.OpenFileAppend(path)iferr!=nil{t.Fatal(err)}deferwronly.Close()write:=bufio.NewWriter

3 ^+ m/ o# t, R q6 L0 }: z

(wronly)fori:=0;i<5;i++{write.WriteString(str)}//Flush将缓存的文件真正写入到文件中 / D4 o; ~5 ~+ O0 G& o! |: X write.Flush()//读取文件写入到控制台 . w: f/ w+ l; r2 n: m0 h8 D files,

8 V! q. {/ w( \

err:=gotool.FileUtils.OpenFileRdonly(path)iferr!=nil{t.Fatal(err)}deferfiles.Close()reader:=bufio.NewReader

E2 Y9 Z: Y5 b

(files)for{str,err:=reader.ReadString(\n)iferr!=nil{break}fmt.Print(str)}}//out ) }1 ^) m5 K- ]2 B2 o1 a9 W% { ===RUNTestOpenFileAppend

2 E( d8 O* P d$ _' s u2 J0 @

hellowordgotoolhellowordgotoolhellowordgotoolhellowordgotoolhellowordgotool追加内容追加内容追加内容追加内容追加内容---PASS

% Q, Y& ^3 y# [, D: ?& q, X

:TestOpenFileAppend(0.00s)PASS8、gotool.FileUtils.FileCopy 文件复制方法funcTestFileCopy(t*testing.T){//文件复制功能1 N4 D' h$ t; ` C4 J

1 F4 p$ e0 A: q0 Q {

path:="F:/go-test/test/test.txt"copyPath:="F:/go-test/test/test.txt1"//复制钱 ( l) ^8 k# j: p5 v7 D% @ exists:=gotool.FileUtils.Exists

* w% J& }, \! s h* X

(copyPath)fmt.Println("复制前文件是否存在------------------>",exists)//复制后0 n% J9 \, n% [4 `' B3 D/ A2 S fileCopy,err:=gotool.FileUtils.FileCopy

( L; k; |% w! M. x3 W. \- |# v% ~3 ]. |

(path,copyPath)iferr!=nil{t.Fatal(err)}iffileCopy{exists:=gotool.FileUtils.Exists(copyPath)fmt.Println

( f# s7 q( b0 {( f z6 a) M- s0 U4 A

("复制前文件是否存在------------------>",exists)}}//out ) C* Z* C' t! S' U ===RUNTestFileCopy复制前文件是否存在------------------>false复制前文件是否存在

2 k7 f" ^" h9 \: H9 C7 _) c

------------------>true---PASS:TestFileCopy(0.00s)PASSCaptchaUtils 验证码生成工具1、gotool.CaptchaUtils.GetRandStr 生成验证码strng串

2 Q) s& _0 P2 B: G4 p

funcTestCaptcha(t*testing.T){//生成验证码字符串,可以进行redis等存储用于验证逻辑0 B3 y M! ]) s ]4 s str:=gotool.CaptchaUtils.GetRandStr(6)fmt.

. ~& ?" \$ W+ ^

Println(str)}//out: F, o o1 n. p5 |% E ===RUNTestCaptcha生成验证码字符串------------------->qK5DME---PASS:TestCaptcha(0.01s)PASS2、gotool.CaptchaUtils.ImgText 生成图片[]byte数组,可以转成base64或者image文件

; L. }; P: p# K9 n6 M* m4 V, A

funcTestCaptcha(t*testing.T){str:=gotool.CaptchaUtils.GetRandStr(6)fmt.Println("生成验证码字符串------------------->"

9 I7 k8 ^: t6 c. ?& I8 ^

,str)//生成图片byte数据,可以根据需要转成base64或者是image图片文件7 ~3 @/ r: _8 \9 E7 o7 Y! U/ n text:=gotool.CaptchaUtils.ImgText(100,40,str)sourcestring

" |2 p/ q; Z- }0 n( C

:=base64.StdEncoding.EncodeToString(text)fmt.Println(sourcestring)}//out( Y( l8 P0 n+ j$ @% @) v ===RUNTestCaptcha生成验证码字符串-------------------

% B) [; ?1 Q% k4 |/ w3 D& |: G

>qK5DMEiVBORw0KGgoAAAANSUhEUgAAAGQAAAAoCAYAAAAIeF9DAAAbcUlEQVR4nOx6B3Rc1bX2PuXeO6MZjUaj3nu15SbLHWNjcIuN8SMYjAMYnPZCebz3QscQWmiPFFoCoRhCCAaDzcPGxrjLlnuTrGJJltW7ZkbSaGZuO

0 t o/ X5 q: e* o9 p) L5 a/ V5 N2 F

+dfd2TLCMtEAvK/ZK3stWbNle69Z87Z3y7f3udQVdd64V/yDyP4/3oC/5LB8i9A/sHkX4D8g8l3BqTX60FlNeXk+5nOBenqdKHve8x

+ n/ l9 B/ b1 G

/BvnOgDi7u9Avf3ev9Mzbz0lev/c7K9Ht6kYP3PmYyfgU7thPv+t4/2zynQFJikli655b6zOur7v3BnPh8b3fWom6rqOiXQfJls92kJNHT2Gf1

/ V" g$ S& I! v+ C; O

/9dp/d/Jowx5FN9qNvfg9o9HbixuxnXOGtxeXslOd5UQg7UHyF7aoro9qrdtKG7aQCH78UCg0xB/P5b75XnT59PHn/9CWnT3s3k3pX3KI5gOx

* i- q. ?/ R1 a u" s) r1 M

/JOLrO4NihEuLp8aDImAhud4SM6P2hRNEUpOgqyEwFv+pDsiaDrClI1VSQdRlk1Y9UXw9SmQYyoXzgeV0BWZORX5NB0RVQNRUZ/zt

$ v8 [4 j* `: U; H" s0 C

/bXzLugrq+ec1GfyaP3BtfHSmDztaZEaksTeuezFg1N9rSBiXOUb/4Om/+P60/k3h+vtuMP/H8ruURZct1L7+3LOP/F5afuu1amJKPPvq

4 p5 ?7 G6 Y: y

/0vrKvCR0uNEUVQQ7BSO+E+QkwdKiHxukaomo/PXiiYj1VCyoWBVPqcIQ4kqUs8rjmmI88GYSowjE+dg5hyMb6GmDyDeDKAyqLGIoAv4OxsBRpibBRMXiQAilfq

+ F9 d- t, P# S. h# m& Z

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6 L4 j! P* H4 y# ?

, ]% i0 J6 X$ Y! s) |0 r& G2 E

---PASS:TestCaptcha(0.01s)PASSLogs 日志打印工具1、gotool.Logs.ErrorLog 异常日志2、gotool.Logs.InfoLog 加载日志3、gotool.Logs.DebugLog 调试日志

# ?& T: V7 b3 A2 T" I3 ~7 g, K2 }

funcTestLogs(t*testing.T){gotool.Logs.ErrorLog().Println("Error日志测试")gotool.Logs.InfoLog().Println("Info日志测试"

4 v& i+ w F7 s- O1 \, @

)gotool.Logs.DebugLog().Println("Debug日志测试")}//out : V2 [) p2 V' Z( u7 [ ===RUNTestLogs[ERROR]2021/07/0715:58:10logs_test.go

! ^ K+ `! m4 `$ f" \* m

:9:Error日志测试[INFO]2021/07/0715:58:10logs_test.go:10:Info日志测试[DEBUG]2021/07/0715:58:10logs_test.go:11:

- e0 N; n* X) o; _% ^

Debug日志测试---PASS:TestLogs(0.00s)PASSPageUtils 分页工具1、gotool.PageUtils.Paginator 彩虹分页funcTestPage(t*testing

. m; I' Q0 P y& i4 L" X

.T){paginator:=gotool.PageUtils.Paginator(5,20,500)fmt.Println(paginator)}//out 7 X1 t, Q; y7 O3 W ===RUNTestPagemap[AfterPage

" f- A& \- m: J! m6 t

:6beforePage:4currPage:5pages:[34567]totalPages:25]---PASS:TestPage(0.00s)PASS//说明 AfterPage 下一页 beforePage前一页 currPage当前页 pages页码 totalPages总页数/ S& d8 R. ]/ q' o' r5 E% d- ?

) U' p H" [( Z4 o8 N. v

IdUtilsid生成工具,可生成字符串id和int类型id,根据需要选择自己需要的生成规则1、gotool.IdUtils.IdUUIDToTime 根据时间生成的UUID规则,入参 true消除“-”false保留“-”

: x5 ?, D5 C$ W) J3 z2 U/ P

funcTestUUID(t*testing.T){time,err:=gotool.IdUtils.IdUUIDToTime(true)iferr==nil{fmt.Println("根据时间生成UUID去除--------------------->------>"

, g6 a+ P" B" R3 r

,time)}time,err=gotool.IdUtils.IdUUIDToTime(false)iferr==nil{fmt.Println("根据时间生成不去除--------------------->------>"

4 ^; G2 j) |; b* ]/ Y

,time)}}//out2 E+ u3 e% N. o, Z ===RUNTestUUID根据时间生成UUID去除--------------------->------>6fb94fe4dfd511ebbc4418c04d462680

% M8 z9 G* H. Z+ J/ R- {

根据时间生成不去除--------------------->------>6fb9c783-dfd5-11eb-bc44-18c04d462680---PASS:TestUUID(0.00s)PASS

9 [+ u" c( X1 P# t' \, y, h6 C

2、gotool.IdUtils.IdUUIDToRan 根据随机数生成的UUID推荐使用本方法,并发不会出现重复现象入,参 true消除“-”false保留“-”time,err:=gotool.IdUtils

' m( @8 c) I5 F$ [' T5 u

.IdUUIDToTime(true)iferr==nil{fmt.Println("根据时间生成UUID去除--------------------->------>",time)}time,err=

$ O/ N) z+ n1 ^9 u

gotool.IdUtils.IdUUIDToTime(false)iferr==nil{fmt.Println("根据时间生成不去除--------------------->------>",time

X# x. \% d: k8 y- W

)}//out: a1 d3 z. ?' }8 {8 W ===RUNTestUUID根据随机数生成UUID去除--------------------->------>cf5bcdc585454cda95447aae186d14e6根据随机数生成不去除

0 r1 A- h# T; A9 L

--------------------->------>72035dba-d45f-480f-b1fd-508d1e036f71---PASS:TestUUID(0.00s)PASS3、gotool.IdUtils.CreateCaptcha 生成随机数id,int类型,入参int 1-18,超过18后会造成int超过长度

. C& { e* I ]

funcTestCreateCaptcha(t*testing.T){captcha,err:=gotool.IdUtils.CreateCaptcha(18)iferr!=nil{fmt.Println

* U1 M& d8 H$ [6 @+ _6 V

(err)}fmt.Println("18位------------------------------------------>",captcha)captcha,err=gotool.IdUtils

3 t3 ]) X" Z6 E9 i% n l* N

.CreateCaptcha(10)iferr!=nil{fmt.Println(err)}fmt.Println("10位------------------------------------------>"

) j! E! B& u% l8 u. x5 y' v T6 \

,captcha)}//out4 G- U& }" Q9 E- y n9 m ===RUNTestCreateCaptcha18位------------------------------------------>492457482855750014

3 n/ a4 F1 ^* F* B @1 g8 V

10位------------------------------------------>2855750014---PASS:TestCreateCaptcha(0.00s)PASS4、gotool.IdUtils.GetIdWork根据时间戳在加以计算获取int64的id 长度16位

1 y/ h7 F& h" B7 R3 m h0 O" N

funcTestGetIdWork(t*testing.T){work:=gotool.IdUtils.GetIdWork()fmt.Println("根据时间戳在加以计算获取int64类型id-------->"

( F, T- M& Q) K$ V3 A

,work)}//out ' f N, C& o. y; Q \, t" W ===RUNTestGetIdWork根据时间戳在加以计算获取int64类型id-------->1625746675366450---PASS:TestGetIdWork(0.00

4 Z9 P7 E4 o t

s)PASSHttpUtilsgolang 的一个简单的“HTTP 请求”包 GETPOSTDELETEPUT我们如何使用HttpUtils?resp,err:=gotool.HttpUtils.Get

& V& F9 J0 b3 c

("http://127.0.0.1:8000")resp,err:=gotool.HttpUtils.SetTimeout(5).Get("http://127.0.0.1:8000")resp,err

# i9 r/ e* k2 ~& v) z4 w" `- Y

:=gotool.HttpUtils.Debug(true).SetHeaders(map[string]string{}).Get("http://127.0.0.1:8000")ORreq:=gotool

$ g; p j6 I# b! @% j

.HttpUtils.NewRequest()req:=gotool.HttpUtils.NewRequest().Debug(true).SetTimeout(5)resp,err:=req.Get(

- H' g: f* t; k! U5 c8 P9 M

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

% T+ N( N, R `. h w# V' A: j

)resp,err:=req.Get("http://127.0.0.1:8000?id=10&title=HttpRequest","address=beijing")设置请求头req.SetHeaders

/ y0 t. G, z9 l/ e: N6 \5 z {: w1 f

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

( m9 d4 t5 z* ]. G4 I

.SetHeaders(map[string]string{"Source":"api",})设置Cookiesreq.SetCookies(map[string]string{"name":"json"

, K2 h$ b: b% z: C, y

,"token":"",})ORgotool.HttpUtils.SetCookies(map[string]string{"age":"19",}).Post()设置超时时间req.SetTimeout

/ p' q* I+ h3 Y% M' W

(5)//default 30s . V* K! M4 T& i! p% w* u 面向对象的操作模式req:=gotool.HttpUtils.NewRequest().Debug(true).SetHeaders(map[string]string

/ B$ e2 K, O9 T0 o6 S: C, J3 \* E+ t

{"Content-Type":"application/x-www-form-urlencoded",}).SetTimeout(5)resp,err:=req.Get("http://127.0.0.1"

/ z1 y2 s5 A( e0 [# B

)resp,err:=gotool.HttpUtils.NewRequest().Get("http://127.0.0.1")GET查询参数resp,err:=req.Get("http://127.0.0.1:8000"

8 \4 \% m* }, t3 ~6 t/ D6 b/ e% x4 i

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

+ _" i/ f( u# q: k, g- }' o( R

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

( M/ O( N* \9 S5 P+ `% B' l

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

9 j1 B- f$ a4 _! R* [

{}).Get("http://127.0.0.1:8000")多参数resp,err:=req.Get("http://127.0.0.1:8000?id=10&title=HttpRequest",

8 I' H5 w0 `- L5 v/ v

map[string]interface{}{"name":"jason","score":100,})deferresp.Close()body,err:=resp.Body()iferr!=nil{

) e) `8 Q3 U, v9 Z3 Z! }

return}returnstring(body)POST// Send nil 5 B% Z' d/ \- R& }, N3 d1 K+ k resp,err:=gotool.HttpUtils.Post("http://127.0.0.1:8000")// Send integer * D2 O6 U- w1 Y( n/ L$ N

( q# Y/ `, E% O7 U) F

resp,err:=gotool.HttpUtils.Post("http://127.0.0.1:8000",100)// Send []byte4 s- t/ L+ g) P. ? resp,err:=gotool.HttpUtils

/ T) n& a, V5 ~2 s! o9 }

.Post("http://127.0.0.1:8000",[]byte("bytes data"))// Send io.Reader 7 l9 M1 h" f% L! ] resp,err:=gotool.HttpUtils.Post(

$ y8 z; r1 P- c8 S! L0 C! t- u

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

, L) D+ x' `6 ?" O

,strings.NewReader("string data"))resp,err:=gotool.HttpUtils.Post("http://127.0.0.1:8000",bytes.NewBuffer

B! E$ g+ w- A) C: r# Y( H( l

(buf[]byte))// Send string. c+ J; ]8 u- R2 G1 V- z resp,err:=gotool.HttpUtils.Post("http://127.0.0.1:8000","title=github&type=1"

! M3 c+ G/ H; }, v# T+ q

)// Send JSON; b& }6 u6 {* E* c2 E resp,err:=gotool.HttpUtils.JSON().Post("http://127.0.0.1:8000","{\"id\":10,\"title\":\"HttpRequest\"}"

1 ]) M; a& H/ a

)// Send map[string]interface{}{} , Q/ M4 z3 V3 Y+ `0 q7 ] resp,err:=req.Post("http://127.0.0.1:8000",map[string]interface{}{"id"

+ _8 q! X8 j" A7 Z

:10,"title":"HttpRequest",})deferresp.Close()body,err:=resp.Body()iferr!=nil{return}returnstring(body

- o! A6 ~) H' O, ?5 @7 ?# S

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

1 M8 K% ]- \4 D" W

,map[string]interface{}{"title":"github"})resp,err:=gotool.HttpUtils.Debug(true).SetHeaders(map[string

0 p6 j1 b( S$ |/ N

]string{}).JSON().Post("http://127.0.0.1:8000","{\"title\":\"github\"}")代理模式proxy,err:=url.Parse("http://proxyip:proxyport"

; ]/ r8 I- b+ Q

)iferr!=nil{log.Println(err)}resp,err:=gotool.HttpUtils.Proxy(http.ProxyURL(proxy)).Get("http://127.0.0.1:8000/ip"

4 S/ x$ x& e* V& r, i/ j5 T

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

1 d6 @2 Q/ W9 g/ H4 _ C

nil{log.Println("Get body error:%v",err.Error())}log.Println(string(body))上传文件Params: url, filename, fileinput

5 v p' }5 I) [* w: r5 M

resp,err:=req.Upload("http://127.0.0.1:8000/upload","/root/demo.txt","uploadFile")body,err:=resp.Body

9 m+ G& n2 R! o' t+ U, D/ M

()deferresp.Close()iferr!=nil{return}returnstring(body)提示模式默认 falsereq.Debug(true)以标准输出打印:[HttpRequest

- ^. l4 o' h$ ?0 \9 w3 n9 b' ^) h: O

]-------------------------------------------------------------------Request:GEThttp://127.0.0.1:8000?name=iceview&age=19&score=1009 t3 o, q: [8 e4 B

' p6 Q8 F4 e/ t5 A

Headers:map[Content-Type:application/x-www-form-urlencoded]Cookies:map[]Timeout:30sReqBody:map[age:19

/ ~7 f8 p# j2 ^+ O* f

score:100]-------------------------------------------------------------------JsonPost JSON 请求设置请求头req

6 ~3 z( R# D$ ~" u$ i6 \* ], Y, W: Y4 d0 Y

.SetHeaders(map[string]string{"Content-Type":"application/json"})Orreq.JSON().Post("http://127.0.0.1:8000"

+ T3 B# { }5 p

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

* T) K7 x2 d" V9 {

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

4 x* t6 u- x: D \% L1 r

,})打印格式化的 JSONstr,err:=resp.Export()iferr!=nil{return}解组 JSONvaruUsererr:=resp.Json(&u)iferr!=nil{return

9 C9 U3 M3 V; m8 \

err}varmmap[string]interface{}err:=resp.Json(&m)iferr!=nil{returnerr}

4 g2 C; |& a# K( W( [ ' ^! {, T* d, l- o u/ k. U1 K3 B5 _" N9 P2 f& c% F( ]( ]* V0 R 6 U t6 |8 H4 f! a) U
回复

使用道具 举报

悠奕 发表于 2026-01-25 14:39:18 | 显示全部楼层
内容很干货,没有多余的废话,值得反复看
回复

使用道具 举报

    您需要登录后才可以回帖 登录 | 加入怎通

    本版积分规则

    QQ|手机版|小黑屋|网站地图|真牛社区 ( 苏ICP备2023040716号-2 )

    GMT+8, 2026-7-8 22:27 , Processed in 0.042106 second(s), 25 queries , Gzip On.

    免责声明:本站信息来自互联网,本站不对其内容真实性负责,如有侵权等情况请联系420897364#qq.com(把#换成@)删除。

    Powered by Discuz! X3.5

    快速回复 返回顶部 返回列表