|
3 A) x8 N, V1 m- v4 N* b0 Q: {) I3 b
gotoolgotool是一个小而全的Golang工具集,主要是将日常开发中常用的到方法进行提炼集成,避免重复造轮子,提高工作效率,每一个方法都是作者经过工作经验,和从以往的项目中提炼出来的2021-7-9更新内容详细使用请看文档。 $ R. c7 w7 D5 C
添加文件IO操作工具FileUtils添加验证码生成工具CaptchaUtils添加文件目录压缩和解压缩工具ZipUtis字符串数组工具StrArrayUtils如何使用gotool呢?安装go get 1 i, R; I# L0 G ~
http://github.com/druidcaesa/gotoolgo.mod http://github.com/druidcaesa/gotool引入import"github.com/druidcaesa/gotool" ; E1 u+ g0 Z, o c
StrUtilsgolang一个string常用工具集,基本涵盖了开发中经常用到的工具,目前正在不端的完善中1、gotool.StrUtils.ReplacePlaceholder 占位符替换funcTestStringReplacePlaceholder 8 X- C3 L n; B' R4 X
(t*testing.T){s:="你是我的{},我是你的{}"placeholder,err:=gotool.StrUtils.ReplacePlaceholder(s,"唯一","所有")iferr + N! T' { F' O9 G
==nil{fmt.Println(placeholder)}}//out: X! g! U/ A: _) F; M6 ~9 D
===RUNTestStringReplacePlaceholder你是我的唯一,我是你的所有---PASS:TestStringReplacePlaceholder
/ ?% {3 `" H8 ?+ V, N/ d4 x! r (0.00s)PASS2、gotool.StrUtils.RemoveSuffix 去除文件扩展名获取文件名funcTestRemoveSuffix(t*testing.T){fullFilename:=
" E; E: U6 m' f! j( O "test.txt"suffix,_:=gotool.StrUtils.RemoveSuffix(fullFilename)fmt.Println(suffix)fullFilename="/root/home/test.txt" ! W/ \9 L% s2 |
suffix,_=gotool.StrUtils.RemoveSuffix(fullFilename)fmt.Println(suffix)}//out5 r! B ?: |6 j1 E O/ ]
===RUNTestRemoveSuffixtest 9 [+ a5 L; U, w8 L: A! Y7 j2 \& c! w
test---PASS:TestRemoveSuffix(0.00s)PASS3、gotool.StrUtils.GetSuffix 获取文件扩展名funcTestGetSuffix(t*testing
8 _( ^9 A- x; g( g .T){fullFilename:="test.txt"suffix,_:=gotool.StrUtils.GetSuffix(fullFilename)fmt.Println(suffix)fullFilename 1 V1 y8 Q) i' E, e
="/root/home/test.txt"suffix,_=gotool.StrUtils.GetSuffix(fullFilename)fmt.Println(suffix)}//out! z- k; h# W# d; y: O4 Y. G
===RUN % F2 F7 Y' D) l- N: ]( [6 |
TestGetSuffix.txt.txt---PASS:TestGetSuffix(0.00s)PASS4、gotool.StrUtils.HasEmpty 判断字符串是否未空,我空返回turefunc
# N5 F/ e+ N; B4 M/ H( r TestHasStr(t*testing.T){str:=""empty:=gotool.StrUtils.HasEmpty(str)fmt.Println(empty)str="11111"empty + X4 m0 [9 ~' Q+ ^ x/ }- i$ K9 u
=gotool.StrUtils.HasEmpty(str)fmt.Println(empty)}//out2 G0 ~( I7 P9 \: m2 l" g
===RUNTestHasStrtruefalse---PASS:TestHasStr(0.00
I' B6 {5 A2 y- h s)PASSStrArrayUtils string数组操作工具1、gotool.StrArrayUtils.StringToInt64 字符串数组转int64数组,调用前请确保字符串数组均为数字func 3 `; h' x, o' r- g5 C6 O
TestStringToInt64(t*testing.T){//字符串数组转int64 D+ Y- a& P! s# j4 u
strings:=[]string{"1","23123","232323"}fmt.Println(reflect
/ u, v% T) e6 E% }0 ~ w& r/ j .TypeOf(strings[0]))toInt64,err:=gotool.StrArrayUtils.StringToInt64(strings)iferr!=nil{t.Fatal(err)}fmt ; ]- p! J' G, Q. f
.Println(reflect.TypeOf(toInt64[0]))}//out
6 q' C p1 i6 y ===RUNTestStringToInt64stringint64---PASS:TestStringToInt64
; N! U8 }- @- s+ {% i (0.00s)PASS2、gotool.StrArrayUtils.StringToInt32 字符串数组转int64数组,调用前请确保字符串数组均为数字funcTestStringToInt32(t* . F7 s( f# @! J2 Y' ]; x4 e) `
testing.T){//字符串数组转int64* r! i% I0 [ e% W; U/ m# H
strings:=[]string{"1","23123","232323"}fmt.Println(reflect.TypeOf(strings[0])) ~ \7 j% `% ~3 v. g9 a6 ]% x
toInt64,err:=gotool.StrArrayUtils.StringToInt32(strings)iferr!=nil{t.Fatal(err)}fmt.Println(reflect.TypeOf
$ Y# ]& w+ ~- @! S$ m1 W (toInt64[0]))}//out7 [6 r: l" g1 a" Q2 Z& S8 |6 W
===RUNTestStringToInt32stringint32---PASS:TestStringToInt32(0.00s)PASS3、gotool.StrArrayUtils.ArrayDuplication 数组去重 ) u- f5 V& O/ o
funcTestArrayDuplication(t*testing.T){//string数组去重
6 [4 Z. T( Y! I& u# J9 l/ `% p strings:=[]string{"hello","word","gotool","word"}fmt
) I! S. B& \5 I0 r6 p+ x2 C .Println("去重前----------------->",strings)duplication:=gotool.StrArrayUtils.ArrayDuplication(strings)fmt - y3 S7 v+ J: S! a& Y T
.Println("去重后----------------->",duplication)}//out
; D0 P; z# `2 }4 s+ E, j( _. G ===RUNTestArrayDuplication去重前----------------->[hello
% k, |( `) W# c; J6 ^5 {- D: a wordgotoolword]去重后----------------->[hellowordgotool]---PASS:TestArrayDuplication(0.00s)PASSDateUtilgolang一个时间操作工具集,基本涵盖了开发中经常用到的工具,目前正在不端的完善中 + h4 C) O! e7 B) k, V3 [. M
1、gotool.DateUtil.FormatToString 时间格式化成字符串funcTestFormatToString(t*testing.T){now:=gotool.DateUtil.Now
) S) K3 S; F- E3 T0 X$ v0 ` ()toString:=gotool.DateUtil.FormatToString(&now,"YYYY-MM-DD hh:mm:ss")fmt.Println(toString)toString=gotool 6 v3 ^ y6 \) `* A- R
.DateUtil.FormatToString(&now,"YYYYMMDD hhmmss")fmt.Println(toString)}//年月日对应YYYY MM DD 时分秒 hhmmss 可进行任意组合 比如 YYYY hh YYYY-DD hh:mm 等
: t3 Q) M- R+ z0 O7 A' X: ]9 D9 y$ A ! J$ B' n" x8 J0 }/ G
//out
: q! h5 a# U! n. o" ]5 P3 X ===RUNTestFormatToString2021-07-0716:13:3020210707161330---PASS:TestFormatToString(0.00s)PASS2、gotool.DateUtil.IsZero 判断时间是否为空 ) R, s! z0 E+ A5 q
//时间为空 true 否则 false0 E+ b' c9 `. U! [" f/ @
funcTestDate_IsZero(t*testing.T){t2:=time.Time{}zero:=gotool.DateUtil.IsZero(t2) 6 g$ T+ M" w s% A; {7 }4 J
fmt.Println(zero)zero=gotool.DateUtil.IsZero(gotool.DateUtil.Now())fmt.Println(zero)}//out: c0 k% [3 a' ?- n6 v
===RUNTestDate_IsZero $ E* x! m4 p& p! `
truefalse---PASS:TestDate_IsZero(0.00s)PASS3、gotool.DateUtil.Now 获取当前时间 等同于time.Now(),为了统一化所以将此方法也纳入到工具中
, ?' m; {& B2 X7 f% Q$ _( c 4、gotool.DateUtil.InterpretStringToTimestamp 字符串格式化成时间类型//参数一 需要格式化的时间字符串 参数二 字符串格式,需要和需格式化字符串格式一致1 A& }: W+ k' y1 M- h1 J" ?
//如 2021-6-4 对应YYYY-MM-DD 2021.6.4 对应YYYY.MM.DD4 F1 G5 B7 w# A) F9 U
: i7 C' Q; V: ~" C; ~% }5 s funcTestInterpretStringToTimestamp(t*testing.T){timestamp,err:=gotool.DateUtil.InterpretStringToTimestamp
0 R0 H% x) X0 u- J6 J ("2021-05-04 15:12:59","YYYY-MM-DD hh:mm:ss")iferr!=nil{gotool.Logs.ErrorLog().Println(err.Error())}fmt
: y+ x' ~. A" [ .Println(timestamp)}//out. J ~( k1 K$ T5 r) W% ^
===RUNTestInterpretStringToTimestamp1620112379---PASS:TestInterpretStringToTimestamp 5 p3 W8 R: d( R# z: t0 T. e
(0.00s)PASS5、gotool.DateUtil.UnixToTime 时间戳转时间funcTestUnixToTime(t*testing.T){unix:=gotool.DateUtil.Now
( o& P2 U" B) }8 I% Q G9 E4 q ().Unix()fmt.Println("时间戳----------------------->",unix)toTime:=gotool.DateUtil.UnixToTime(unix)fmt.Println
: o- S6 n; C$ p4 |, O8 ` (toTime)}//out
/ Y& D) {3 v- o7 S$ [1 L ===RUNTestUnixToTime时间戳----------------------->16256456822021-07-0716:14:42+0800CST--- ( P, ]! q5 U5 H& g' o' W
PASS:TestUnixToTime(0.00s)PASS6、gotool.DateUtil.GetWeekDay 获取星期几funcTestGetWeekDay(t*testing.T){now:=
?) `2 \1 `+ d( [8 e- |- |) H$ i# U gotool.DateUtil.Now()day:=gotool.DateUtil.GetWeekDay(now)fmt.Println("今天是-----------------周",day)}//out
1 n, D+ [. R) x2 S, f: B
4 l8 L# Q+ Q) o5 y7 Z0 q! r @* |2 d ===RUNTestGetWeekDay今天是-----------------周3---PASS:TestGetWeekDay(0.00s)PASS7、gotool.DateUtil.MinuteAddOrSub,HourAddOrSub,DayAddOrSub 时间计算工具 . X5 T+ k5 \6 m! p ~
//时间计算
+ |) {9 w1 T+ B9 i4 x: j funcTestTimeAddOrSub(t*testing.T){now:=gotool.DateUtil.Now()fmt.Println("现在时间是--------------------->"
; R, N# m$ g0 [6 E; U0 ]4 F( W& t6 R7 v ,now)sub:=gotool.DateUtil.MinuteAddOrSub(now,10)fmt.Println("分钟计算结果-------------------->",sub)sub=gotool ( w5 m/ E$ p. o8 P; b2 Z( j
.DateUtil.MinuteAddOrSub(now,-10)fmt.Println("分钟计算结果-------------------->",sub)sub=gotool.DateUtil.HourAddOrSub & W" {# j. {- G; m- e7 a1 t
(now,10)fmt.Println("小时计算结果-------------------->",sub)sub=gotool.DateUtil.HourAddOrSub(now,-10)fmt.Println % {3 l1 X! _7 V+ r* D
("小时计算结果-------------------->",sub)sub=gotool.DateUtil.DayAddOrSub(now,10)fmt.Println("天计算结果-------------------->" % r3 K4 B: A2 a, z
,sub)sub=gotool.DateUtil.DayAddOrSub(now,-10)fmt.Println("天计算结果-------------------->",sub)}//现在时间是---------------------> 2021-07-07 11:18:17.8295757 +0800 CST m=+0.012278001
0 [# e5 n7 K3 i3 e1 L b% ]$ \
$ x3 `6 _, M1 T( f //分钟计算结果--------------------> 2021-07-07 11:28:17.8295757 +0800 CST m=+600.012278001% ?; x8 w6 ]+ r, K
//分钟计算结果--------------------> 2021-07-07 11:08:17.8295757 +0800 CST m=-599.987721999 [1 ]% y& T" N* p
! T! b6 Z! |% k% T) K //小时计算结果--------------------> 2021-07-07 21:18:17.8295757 +0800 CST m=+36000.012278001
+ U$ Z% N5 ~! H% v" x //小时计算结果--------------------> 2021-07-07 01:18:17.8295757 +0800 CST m=-35999.987721999
, @# T H; U' k- ^' x7 C 4 k6 q- \& U' j4 ~8 Z( c
//天计算结果--------------------> 2021-07-17 11:18:17.8295757 +0800 CST m=+864000.012278001! U2 ]0 b" v0 D: Z" a# {
//天计算结果--------------------> 2021-06-27 11:18:17.8295757 +0800 CST m=-863999.987721999
1 f' b) U- J0 l% e: V
0 Q/ l2 F% c& h# _ ConvertUtils 公历转农历工具1、gotool.ConvertUtils.GregorianToLunarCalendar(公历转农历),GetLunarYearDays(农历转公历),GetLunarYearDays(获取农历这一年农历天数) 7 _" y- r0 O3 | p7 Y1 w
funcTestConvertTest(t*testing.T){calendar:=gotool.ConvertUtils.GregorianToLunarCalendar(2020,2,1)fmt.
0 W$ A! H5 ?. f, [) P7 O$ [ Println(calendar)gregorian:=gotool.ConvertUtils.LunarToGregorian(calendar[0],calendar[1],calendar[2],
R& S+ O# k, w) J$ X9 _3 t* M false)fmt.Println(gregorian)days:=gotool.ConvertUtils.GetLunarYearDays(2021)fmt.Println(days)}//[2020 1 8]
. ^! Q- L- U# u2 ]
2 D% O/ v, t. X4 y" d //[2020 2 1]
- l+ f' I7 C$ M2 U0 t/ t2 _ //354
( W/ L: Q3 _$ T" r. k# N/ C 2、gotool.ConvertUtils.GetSolarMonthDays(2021,7)获取公历某月天数 2021年7月天数3、gotool.ConvertUtils.IsLeapYear(2021)获取某年是否是瑞年 true是 false不是 4 \& N% `& ]2 ?
4、gotool.ConvertUtils.GetLeapMonth(2021)获取某年闰月月份BcryptUtils 加密和解密工具1、gotool.BcryptUtils.Generate 加密处理,多用于密码进行加密后数据库存储使用,不可逆
* I# S" J' ^8 r2 B) s: I 2、gotool.BcryptUtils.CompareHash 加密后和未加密密码对比,多用于登录验证使用funcTestGenerate(t*testing.T){//进行加密/ f* u9 p* O/ k' G' G" x6 E, y4 L
generate:= 3 U& Y1 O0 h1 z' H: t4 T( U
gotool.BcryptUtils.Generate("123456789")fmt.Println(generate)//进行加密对比' ~# d7 B+ z+ F3 o0 z& j" M; t
hash:=gotool.BcryptUtils.CompareHash % ?) X) a7 O; L! x
(generate,"123456789")fmt.Println(hash)}//out: `" u( z1 t, R6 M& M7 E- q& B
===RUNTestGenerate$2a$10$IACJ6zGuNuzaumrvDz58Q.vJUzz4JGqougYKrdCs48rQYIRjAXcU2
9 s8 n# r1 B2 K @4 h true---PASS:TestGenerate(0.11s)PASS3、gotool.BcryptUtils.MD5 md5加密funcTestMd5(t*testing.T){md5:=gotool
1 r7 t2 C4 E# W .BcryptUtils.MD5("123456789")fmt.Println(md5)}//out6 H+ P6 {2 W& Q" z' n# ~
===RUNTestMd525f9e794323b453885f5181f1b624d0b---PASS 3 w, o3 |% C3 y* w' E
:TestMd5(0.00s)PASS4、gotool.BcryptUtils.GenRsaKey(获取公钥和私钥),5、RsaSignWithSha256(进行签名),6、RsaVerySignWithSha256(验证), ! U$ n1 [4 D# F9 |1 W) N+ B4 |
7、RsaEncrypt(公钥加密),8、RsaDecrypt(私钥解密)funcTestRsa(t*testing.T){//rsa 密钥文件产生% m9 O) g8 O' |+ z6 o& ~
fmt.Println("-------------------------------获取RSA公私钥-----------------------------------------"
4 P* H7 \: X/ x )prvKey,pubKey:=gotool.BcryptUtils.GenRsaKey()fmt.Println(string(prvKey))fmt.Println(string(pubKey))fmt
& T# G* o1 P7 K6 ` .Println("-------------------------------进行签名与验证操作-----------------------------------------")vardata=
1 u# W& v: z$ d* b3 ?& b7 z! v "我是被加密的数据记住我哦-------------------------------"fmt.Println("对消息进行签名操作...")signData:=gotool.BcryptUtils. + p' s' l' t( o8 D5 I$ q+ z; F. U
RsaSignWithSha256([]byte(data),prvKey)fmt.Println("消息的签名信息: ",hex.EncodeToString(signData))fmt.Println , E) m* c: D$ ~7 d8 v, l
("\n对签名信息进行验证...")ifgotool.BcryptUtils.RsaVerySignWithSha256([]byte(data),signData,pubKey){fmt.Println $ u8 @. C- }0 k6 p$ s
("签名信息验证成功,确定是正确私钥签名!!")}fmt.Println("-------------------------------进行加密解密操作-----------------------------------------"
( H# J) K' _4 [6 z I2 g )ciphertext:=gotool.BcryptUtils.RsaEncrypt([]byte(data),pubKey)fmt.Println("公钥加密后的数据:",hex.EncodeToString , _1 o J; j4 _- k6 ]
(ciphertext))sourceData:=gotool.BcryptUtils.RsaDecrypt(ciphertext,prvKey)fmt.Println("私钥解密后的数据:",string 0 q# ^9 B2 N9 |: f( I6 u2 s" Z6 x" }
(sourceData))}//out8 q. }4 v, K. x: D+ B$ t0 l: K( y
===RUNTestRsa-------------------------------获取RSA公私钥----------------------------------------- . @" l* V/ x$ ]& C9 J
-----BEGINRSAPRIVATEKEY-----MIICXAIBAAKBgQCgHh1ZYFjlxrIJYjjWGFaLwC8Oov8KqyMtHa+GauF121dperr3i46JyDoskoSBhbkmqv70LMNrjqVdttdIsC0BtH9ThWLBwKVLH56EqfzqlzClKZEh
: J: w: s, G3 g+ e4 G/ q WTNaddCSuxoZpN33mwS82DCjZe3d7nAPdEGD5pSBx6TVt5bG1c3NVAmcBQIDAQABAoGAWc5KO9T0R3xYYzb6Fer0r9GNEzKMxdkTE7zws ! B0 w c1 |; @. E2 R
/3Cky4BKyIxN6LIwbLSHinXtCXioTOLaDyrJuqNCbEBsr1NoCIPxnswA5Jm5QDYO5x9aq4u8+SZ9KqLbMrO1JDSZV7Cbiblz1xNMfdVIvlVjD5RdEotbYTbHI2CZUoPsjHng8kCQQDHi6TJYJqvej8r
; X9 q3 m. O5 X5 t q46ZceuWHDgE81Wu16RrA/kZKi6MJAApQtfO/4HM6W/ImbCjZ2rSYxqnAlIg/GxAdT6iJABjAkEAzWra06RyhGm3lk9j9Xxc0YPX6VX7qT5Iq6c7ry1JtTSeVOksKANG
$ g* z- B0 |- f5 [ G elaNnCj8YYUgj7BeBBcMMvLd39hP1h06dwJAINTyHQwfB2ZGxImqocajq4QjF3VuEKF8dPsnXiOZmwdFW4Sa+30Av1VdRhU7gfc/FTSnKvlvx
/ ~" ^7 c q6 ]. f3 d +ugaA6iao0f3wJBALa8sTCH4WwUE8K+m4DeAkBMVn34BKnZg5JYcgrzcdemmJeW2rY5u6/HYbCi8WnboUzSK8Dds/d7AJBKgTNLyx8CQBAeU0St3Vk6SJ6H71J8YtVxlRGDjS2fE0JfUBrpI : ^8 }* n% ~+ @, [3 G/ l
/bgr/QI8yMAMyFkt1YshN+UNWJcvR5SXQnyT/udnWJIdg4=-----ENDRSAPRIVATEKEY----------BEGINPUBLICKEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCgHh1ZYFjlxrIJYjjWGFaLwC8O $ ~4 C: @; [8 d3 j3 k4 w: Z/ p; i
ov8KqyMtHa+GauF121dperr3i46JyDoskoSBhbkmqv70LMNrjqVdttdIsC0BtH9ThWLBwKVLH56EqfzqlzClKZEhWTNaddCSuxoZpN33mwS82DCjZe3d7nAPdEGD5pSB
P! w: P& O& x0 B; z x6TVt5bG1c3NVAmcBQIDAQAB-----ENDPUBLICKEY------------------------------------进行签名与验证操作----------------------------------------- " V' C, M- Z9 w( b
对消息进行签名操作...消息的签名信息:1fcf20c4fb548c8fc0906e369287feb84c861bf488d822d78a0eada23d1af66ed3a12e9440d7181b1748fd0ad805222cf2ce7ce1f6772b330ef11b717700ba26945dda9d749a5c4d8c108ede103c17bed92801a4c3fbc1ebf38d10bf4bf183713eeb7f429acc3dcc3812366a324737f756720f3f9e75ddda1e024a7698b89163 ; C8 K. D+ P$ n. y! A0 |# \. E
对签名信息进行验证...签名信息验证成功,确定是正确私钥签名!!-------------------------------进行加密解密操作-----------------------------------------
) C k5 z9 C) A' a% j6 ? 公钥加密后的数据:637b05798c1cf95cfcc63adf228645c77f8e9a9f34b12b722e6938ded8c9560a0430171a4f940d3fb2d96bc6c470c80a817d81f4a2669b991adbff5b22b335129e514c921083ce3e64c1c876409d9b763d5e8e269797283ef951a364da6a59a1d8454391356cb0cd0808092e9dd7ac371f9247a43760f3c82b7ad26a32a7a807
2 t. W0 Z& y3 X2 M7 f 私钥解密后的数据:我是被加密的数据记住我哦----------------------------------PASS:TestRsa(0.02s)PASSZipUtils压缩和解压工具,可单文件压缩也可进行目录压缩,或者跨目录压缩 $ _& O- h1 Z, H, t- H8 l
1、gotool.ZipUtils.Compressfiles 文件数组 可以是多目录文件dest 压缩文件存放地址funcTestCompress(t*testing.T){open,err:=os.
& ~, T \, {) K4 v& K Open("/Users/fanyanan/Downloads/gotool")iferr!=nil{t.Fatal(err)}files:=[]*os.File{open}flag,err:=gotool / ~! h5 c$ W) p, [! S/ V; L
.ZipUtils.Compress(files,"/Users/fanyanan/Downloads/test.zip")iferr!=nil{t.Fatal(err)}ifflag{fmt.Println ! h8 C: J4 z7 j3 P
("压缩成功")}}//out
6 s0 m" `3 r* {) l3 Q2 m ===RUNTestCompress压缩成功---PASS:TestCompress(0.12s)PASS2、gotool.ZipUtils.DeCompresszipFile 压缩包路径 ' m+ h! r0 q, z% F
dest 要解压的路径funcTestDeCompress(t*testing.T){compress,err:=gotool.ZipUtils.DeCompress("/Users/fanyanan/Downloads/test.zip"
& |' p+ u7 h9 j E: A0 O. t ,"/Users/fanyanan/Downloads")iferr!=nil{t.Fatal(err)}ifcompress{fmt.Println("解压成功")}}//out5 s8 ?0 t6 {! @
===RUNTestDeCompress 3 W* R' i# O" t a; U: k
解压成功---PASS:TestDeCompress(0.44s)PASSFileUtils文件操作工具,让做io操作更简单各个方便,让io操作不是那么难1、gotool.FileUtils.Exists 判断文件或者目录是否存在 ! i; L* p# A+ w) J4 P' z' ?
funcTestFileExists(t*testing.T){//判断文件或目录是否存在
( _2 @9 C% `8 ?. }# B+ a N7 l, b1 _ exists:=gotool.FileUtils.Exists("F:/go-test/test")fmt.Println
2 N k& a+ X( [$ k* h ("创建前------------------------>",exists)err:=os.MkdirAll("F:/go-test/test",os.ModePerm)iferr!=nil{t.Fatal
4 }* T4 P H% V (err)}exists=gotool.FileUtils.Exists("F:/go-test/test")fmt.Println("创建后------------------------>",exists 3 t) E% r& c' @" o
)}//out
/ y$ v+ X9 ^. V) Y8 ~4 K* m ===RUNTestFileExists创建前------------------------>false创建后------------------------>true---PASS:
8 M4 Z! r7 d# Q. t' e TestFileExists(0.00s)PASS2、gotool.FileUtils.IsDir 判断是否是目录funcTestIsDir(t*testing.T){//判断是否是目录, v1 `% z% k5 z w( G' e7 t1 P
dir:=gotool
$ d' O# D* K, w6 J; X .FileUtils.IsDir("F:/go-test/test")fmt.Println("是否是目录--------------------->",dir)dir=gotool.FileUtils 8 g& |: U5 q* m7 x) `
.IsDir("F:/go-test/test/test.txt")fmt.Println("是否是目录--------------------->",dir)}//out/ x: R& t5 R5 @# \+ ^, s" X; P5 C
===RUNTestIsDir
) |6 f- q' l( j5 C# T* i 是否是目录--------------------->true是否是目录--------------------->false---PASS:TestIsDir(0.00s)PASS3、gotool.FileUtils.IsFile 判断是否是文件
4 l; B* N; i' _6 Y# z funcTestIsFile(t*testing.T){//判断是否是文件* J, `( J( A N% S, u& L
file:=gotool.FileUtils.IsFile("F:/go-test/test")fmt.Println("是否是文件--------------------->" 2 X& V9 r& ?; O h
,file)file=gotool.FileUtils.IsFile("F:/go-test/test/test.txt")fmt.Println("是否是文件--------------------->" 4 c0 ~1 H; X% `3 W% ?* s# |
,file)}//out: G& [% n* U- D: V
===RUNTestIsFile是否是文件--------------------->false是否是文件--------------------->true---PASS:TestIsFile ( c! Y; w5 W. d- ?$ W' H
(0.00s)PASS4、gotool.FileUtils.RemoveFile 删除文件或目录funcTestRemove(t*testing.T){//删除文件/ z6 ^ ~5 o( P8 ?. f$ b
file,err:=gotool.FileUtils
/ Q% O9 x2 D! k8 l8 }2 H( N .RemoveFile("F:/go-test/test/test.txt")iferr!=nil{t.Fatal(err)}iffile{//查看文件是否还存在
( f( F8 g P" n5 }* i exists:=gotool.FileUtils
+ P# n- M. H) W6 v6 j3 i6 n .Exists("F:/go-test/test/test.txt")fmt.Println("文件是否存在------------------------>",exists)}}//out
( }* }+ k6 l6 e. q+ n ===RUN ! _- @1 L3 t: c+ L0 K6 E% S
TestRemove文件是否存在------------------------>false---PASS:TestRemove(0.00s)PASS5、gotool.FileUtils.OpenFileWronly 只写模式打开文件,没有将自动创建,写入内从进行测试
- h5 p& ?+ ~$ n5 ~7 j/ W4 l funcTestOpenFileWronly(t*testing.T){//用只写模式打开一个文件,并且写入5条内容,若文件不存在将会创建一个/ I5 m+ N4 `/ S% _/ b
path:="F:/go-test/test/test.txt"
6 \+ K3 K; t+ ]; Q str:="hello word gotool \n"wronly,err:=gotool.FileUtils.OpenFileWronly(path)iferr!=nil{t.Fatal(err)}defer $ Y7 T d# M4 w
wronly.Close()write:=bufio.NewWriter(wronly)fori:=0;i<5;i++{write.WriteString(str)}//Flush将缓存的文件真正写入到文件中
) q' c7 u _0 k! O, f2 `0 M! B1 n& K% a
4 b! n p/ C/ {" P5 w8 @ write.Flush()//读取文件写入到控制台( W# ^* T w, d' L, [ \! |
files,err:=gotool.FileUtils.OpenFileRdonly(path)iferr!=nil{t.Fatal(err)}defer
1 Z' N1 M# Y8 ~0 h. i5 X files.Close()reader:=bufio.NewReader(files)for{str,err:=reader.ReadString(\n)iferr!=nil{break}fmt.Print
& B a1 E9 X1 }* ? (str)}}//out
( `# k" W1 {0 |8 t' |$ X+ f ===RUNTestOpenFileWronlyhellowordgotoolhellowordgotoolhellowordgotoolhellowordgotoolhello
% Q: r+ v. N' Z6 M/ \: K wordgotool---PASS:TestOpenFileWronly(0.00s)PASS6、gotool.FileUtils.OpenFileRdonly 只读模式打开文件,读取内容输出到控制台func 5 `# E6 q0 A- P5 l! X( C5 r
TestOpenFileRdonly(t*testing.T){path:="F:/go-test/test/test.txt"files,err:=gotool.FileUtils.OpenFileRdonly
# l6 J$ `* ]' s: ^# K (path)iferr!=nil{t.Fatal(err)}deferfiles.Close()reader:=bufio.NewReader(files)for{str,err:=reader.ReadString
7 U+ P% L9 d, q9 n) ]. b (\n)iferr!=nil{break}fmt.Print(str)}}//out3 J+ Y6 n4 o; F6 s, t2 U" c" w
===RUNTestOpenFileRdonlyhellowordgotoolhellowordgotoolhello 2 L* N0 o7 [7 t4 \" F4 a
wordgotoolhellowordgotoolhellowordgotool---PASS:TestOpenFileRdonly(0.00s)PASS7、gotool.FileUtils.OpenFileAppend 打开文件在文件后面追加内容,没有将自动创建文件 - C* O, l# N% W3 s
funcTestOpenFileAppend(t*testing.T){//打开文件在文件后面追加数据
( V- r) _0 E4 w% q% m6 H* Y9 v path:="F:/go-test/test/test.txt"str:="追加内容 \n"wronly
0 }) L" P: W* M2 B# e! ^ ,err:=gotool.FileUtils.OpenFileAppend(path)iferr!=nil{t.Fatal(err)}deferwronly.Close()write:=bufio.NewWriter 4 E; Z% n \% Q
(wronly)fori:=0;i<5;i++{write.WriteString(str)}//Flush将缓存的文件真正写入到文件中
1 j' H9 ^; v! P, _# v8 _9 b write.Flush()//读取文件写入到控制台
7 w: R* b% z) O% Z$ ~2 w files, / ?6 ]. `( v5 U/ n
err:=gotool.FileUtils.OpenFileRdonly(path)iferr!=nil{t.Fatal(err)}deferfiles.Close()reader:=bufio.NewReader $ P# p% u( k7 ^+ n K1 s1 s
(files)for{str,err:=reader.ReadString(\n)iferr!=nil{break}fmt.Print(str)}}//out: e' M1 i+ M4 m- B
===RUNTestOpenFileAppend
0 g/ X$ \+ z0 ]' I: L hellowordgotoolhellowordgotoolhellowordgotoolhellowordgotoolhellowordgotool追加内容追加内容追加内容追加内容追加内容---PASS 3 V% o) t" ]+ X; ^4 {
:TestOpenFileAppend(0.00s)PASS8、gotool.FileUtils.FileCopy 文件复制方法funcTestFileCopy(t*testing.T){//文件复制功能
8 K4 Q9 P# R8 D; G o: v, {7 G9 [! {9 L; }: R
path:="F:/go-test/test/test.txt"copyPath:="F:/go-test/test/test.txt1"//复制钱
7 w9 P+ P1 U, M7 p. p; b exists:=gotool.FileUtils.Exists
8 h' b2 Y5 e" m. y" L! O0 C7 p- K: l# t (copyPath)fmt.Println("复制前文件是否存在------------------>",exists)//复制后
5 J x* {% G: O0 H. Y* u+ N fileCopy,err:=gotool.FileUtils.FileCopy . c" p2 O! L/ U
(path,copyPath)iferr!=nil{t.Fatal(err)}iffileCopy{exists:=gotool.FileUtils.Exists(copyPath)fmt.Println
, w3 }: l/ m- L, L- e ("复制前文件是否存在------------------>",exists)}}//out
3 w* E( o5 ~' l, F! u9 q! j ===RUNTestFileCopy复制前文件是否存在------------------>false复制前文件是否存在
3 g6 P# t5 e0 X% d1 l ------------------>true---PASS:TestFileCopy(0.00s)PASSCaptchaUtils 验证码生成工具1、gotool.CaptchaUtils.GetRandStr 生成验证码strng串 1 k; p* ]. N8 g! u7 z9 R$ l
funcTestCaptcha(t*testing.T){//生成验证码字符串,可以进行redis等存储用于验证逻辑
8 R9 s0 n/ h' i" L9 H& R" G3 a str:=gotool.CaptchaUtils.GetRandStr(6)fmt.
6 y8 O( P3 F3 A Println(str)}//out
" c- y; A8 Q; o @+ k ===RUNTestCaptcha生成验证码字符串------------------->qK5DME---PASS:TestCaptcha(0.01s)PASS2、gotool.CaptchaUtils.ImgText 生成图片[]byte数组,可以转成base64或者image文件 8 z$ F; Z4 L1 R4 ]6 Y# k: q+ S: G
funcTestCaptcha(t*testing.T){str:=gotool.CaptchaUtils.GetRandStr(6)fmt.Println("生成验证码字符串------------------->"
& y! z2 M. `' T ,str)//生成图片byte数据,可以根据需要转成base64或者是image图片文件
4 {- r- P5 g; f$ E' `; I# }* G3 g text:=gotool.CaptchaUtils.ImgText(100,40,str)sourcestring
% z$ d. ~% i: W5 D4 ?7 h& V :=base64.StdEncoding.EncodeToString(text)fmt.Println(sourcestring)}//out4 a1 U; p% P1 F) b9 o
===RUNTestCaptcha生成验证码字符串-------------------
* P2 c E& J9 s( O- s >qK5DMEiVBORw0KGgoAAAANSUhEUgAAAGQAAAAoCAYAAAAIeF9DAAAbcUlEQVR4nOx6B3Rc1bX2PuXeO6MZjUaj3nu15SbLHWNjcIuN8SMYjAMYnPZCebz3QscQWmiPFFoCoRhCCAaDzcPGxrjLlnuTrGJJltW7ZkbSaGZuO 6 P! u' q$ R! V
+dfd2TLCMtEAvK/ZK3stWbNle69Z87Z3y7f3udQVdd64V/yDyP4/3oC/5LB8i9A/sHkX4D8g8l3BqTX60FlNeXk+5nOBenqdKHve8x % I. A5 ^( |* y2 k
/BvnOgDi7u9Avf3ev9Mzbz0lev/c7K9Ht6kYP3PmYyfgU7thPv+t4/2zynQFJikli655b6zOur7v3BnPh8b3fWom6rqOiXQfJls92kJNHT2Gf1
9 \8 z ?" t' a. F/ J( g /9dp/d/Jowx5FN9qNvfg9o9HbixuxnXOGtxeXslOd5UQg7UHyF7aoro9qrdtKG7aQCH78UCg0xB/P5b75XnT59PHn/9CWnT3s3k3pX3KI5gOx : i4 y0 m( ]: x' p; ]' q0 R; p
/JOLrO4NihEuLp8aDImAhud4SM6P2hRNEUpOgqyEwFv+pDsiaDrClI1VSQdRlk1Y9UXw9SmQYyoXzgeV0BWZORX5NB0RVQNRUZ/zt " a5 p0 F- y" e
/bXzLugrq+ec1GfyaP3BtfHSmDztaZEaksTeuezFg1N9rSBiXOUb/4Om/+P60/k3h+vtuMP/H8ruURZct1L7+3LOP/F5afuu1amJKPPvq , Q$ a, ]6 t& T1 P: O
/0vrKvCR0uNEUVQQ7BSO+E+QkwdKiHxukaomo/PXiiYj1VCyoWBVPqcIQ4kqUs8rjmmI88GYSowjE+dg5hyMb6GmDyDeDKAyqLGIoAv4OxsBRpibBRMXiQAilfq ' I$ j$ [! G. S! [
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' l& m* [0 l% Y# c/ S1 X0 ]2 Q# t6 l
2 i+ G* O/ X w5 G
---PASS:TestCaptcha(0.01s)PASSLogs 日志打印工具1、gotool.Logs.ErrorLog 异常日志2、gotool.Logs.InfoLog 加载日志3、gotool.Logs.DebugLog 调试日志
( i O* @( n/ F( z# t% Z# e funcTestLogs(t*testing.T){gotool.Logs.ErrorLog().Println("Error日志测试")gotool.Logs.InfoLog().Println("Info日志测试" ! h3 d+ ?: A, X
)gotool.Logs.DebugLog().Println("Debug日志测试")}//out1 |- s1 a- y |) x# g# Y* h' s1 }( ]
===RUNTestLogs[ERROR]2021/07/0715:58:10logs_test.go : r% W: R# j5 p5 M9 _9 y
:9:Error日志测试[INFO]2021/07/0715:58:10logs_test.go:10:Info日志测试[DEBUG]2021/07/0715:58:10logs_test.go:11:
$ z& n. Y; _% z$ _( X9 T Debug日志测试---PASS:TestLogs(0.00s)PASSPageUtils 分页工具1、gotool.PageUtils.Paginator 彩虹分页funcTestPage(t*testing
6 T3 \8 S& C5 O5 R: P .T){paginator:=gotool.PageUtils.Paginator(5,20,500)fmt.Println(paginator)}//out
5 Y6 g" Q# A3 `( e# N$ ] ===RUNTestPagemap[AfterPage 3 u) y( C" ^ K q' P: E
:6beforePage:4currPage:5pages:[34567]totalPages:25]---PASS:TestPage(0.00s)PASS//说明 AfterPage 下一页 beforePage前一页 currPage当前页 pages页码 totalPages总页数
8 P' }' T! M# [: ?- z; n
7 |* x* u/ R3 R4 o$ u6 r IdUtilsid生成工具,可生成字符串id和int类型id,根据需要选择自己需要的生成规则1、gotool.IdUtils.IdUUIDToTime 根据时间生成的UUID规则,入参 true消除“-”false保留“-”
1 W8 `$ N4 ^8 U funcTestUUID(t*testing.T){time,err:=gotool.IdUtils.IdUUIDToTime(true)iferr==nil{fmt.Println("根据时间生成UUID去除--------------------->------>" - k7 ~1 L7 a3 B: O$ N4 t1 Z& {
,time)}time,err=gotool.IdUtils.IdUUIDToTime(false)iferr==nil{fmt.Println("根据时间生成不去除--------------------->------>" ) g5 E. T# n' Y" v
,time)}}//out5 ` W( l# s8 F" K
===RUNTestUUID根据时间生成UUID去除--------------------->------>6fb94fe4dfd511ebbc4418c04d462680
4 d$ V: \- s' U7 K' a+ p. F8 j5 K 根据时间生成不去除--------------------->------>6fb9c783-dfd5-11eb-bc44-18c04d462680---PASS:TestUUID(0.00s)PASS
/ h' f7 x7 F) P* y9 A' @. E 2、gotool.IdUtils.IdUUIDToRan 根据随机数生成的UUID推荐使用本方法,并发不会出现重复现象入,参 true消除“-”false保留“-”time,err:=gotool.IdUtils 0 X0 D6 x# Y5 w
.IdUUIDToTime(true)iferr==nil{fmt.Println("根据时间生成UUID去除--------------------->------>",time)}time,err= 7 K6 G; t* `# j* s2 M
gotool.IdUtils.IdUUIDToTime(false)iferr==nil{fmt.Println("根据时间生成不去除--------------------->------>",time
L1 v/ t. p$ [6 U, g0 g )}//out
6 o; @& ?# S2 N( @/ L( ~& J ===RUNTestUUID根据随机数生成UUID去除--------------------->------>cf5bcdc585454cda95447aae186d14e6根据随机数生成不去除
5 U/ i; W m9 C% i --------------------->------>72035dba-d45f-480f-b1fd-508d1e036f71---PASS:TestUUID(0.00s)PASS3、gotool.IdUtils.CreateCaptcha 生成随机数id,int类型,入参int 1-18,超过18后会造成int超过长度
5 [: C; w7 ]9 F- d9 z funcTestCreateCaptcha(t*testing.T){captcha,err:=gotool.IdUtils.CreateCaptcha(18)iferr!=nil{fmt.Println
* U( }+ ^& F1 \! ] (err)}fmt.Println("18位------------------------------------------>",captcha)captcha,err=gotool.IdUtils . F/ [2 \# m. X" T
.CreateCaptcha(10)iferr!=nil{fmt.Println(err)}fmt.Println("10位------------------------------------------>" / H: ?. Y1 v: Z6 C
,captcha)}//out
: U7 u% R% Q# y0 h0 g* V ===RUNTestCreateCaptcha18位------------------------------------------>492457482855750014 5 M0 J! v& K4 s
10位------------------------------------------>2855750014---PASS:TestCreateCaptcha(0.00s)PASS4、gotool.IdUtils.GetIdWork根据时间戳在加以计算获取int64的id 长度16位 & G6 n1 K2 p4 d7 |& M
funcTestGetIdWork(t*testing.T){work:=gotool.IdUtils.GetIdWork()fmt.Println("根据时间戳在加以计算获取int64类型id-------->" 4 f9 {2 W) K& `+ v
,work)}//out
' e4 _. {# U$ ~ ===RUNTestGetIdWork根据时间戳在加以计算获取int64类型id-------->1625746675366450---PASS:TestGetIdWork(0.00 # \2 a+ x: V! t2 f
s)PASSHttpUtilsgolang 的一个简单的“HTTP 请求”包 GETPOSTDELETEPUT我们如何使用HttpUtils?resp,err:=gotool.HttpUtils.Get
( H, L1 G0 x: B, I" J( c& h ("http://127.0.0.1:8000")resp,err:=gotool.HttpUtils.SetTimeout(5).Get("http://127.0.0.1:8000")resp,err
4 |8 R3 |: k8 \/ [0 L! n :=gotool.HttpUtils.Debug(true).SetHeaders(map[string]string{}).Get("http://127.0.0.1:8000")ORreq:=gotool
, S" t- Z5 h7 `! X0 j .HttpUtils.NewRequest()req:=gotool.HttpUtils.NewRequest().Debug(true).SetTimeout(5)resp,err:=req.Get(
+ g8 Y# b3 x4 ], E5 S9 q6 n: P "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"
( N9 R5 p$ X: ~ )resp,err:=req.Get("http://127.0.0.1:8000?id=10&title=HttpRequest","address=beijing")设置请求头req.SetHeaders # w) v ~5 [4 K& \$ }
(map[string]string{"Content-Type":"application/x-www-form-urlencoded","Connection":"keep-alive",})req $ T5 a# V' }& e I
.SetHeaders(map[string]string{"Source":"api",})设置Cookiesreq.SetCookies(map[string]string{"name":"json" ! `4 P' a# e+ A8 M, ]9 m
,"token":"",})ORgotool.HttpUtils.SetCookies(map[string]string{"age":"19",}).Post()设置超时时间req.SetTimeout 0 K7 ? d2 i2 c; B/ F
(5)//default 30s
0 g8 z2 j* `. F7 o5 u/ K3 y$ F 面向对象的操作模式req:=gotool.HttpUtils.NewRequest().Debug(true).SetHeaders(map[string]string . Y4 ~3 x0 t2 O6 u- ]0 V! u5 @
{"Content-Type":"application/x-www-form-urlencoded",}).SetTimeout(5)resp,err:=req.Get("http://127.0.0.1"
* e0 Q/ W0 ?) V) _ )resp,err:=gotool.HttpUtils.NewRequest().Get("http://127.0.0.1")GET查询参数resp,err:=req.Get("http://127.0.0.1:8000" : `- s& V5 T* ]/ K$ M' X5 ]
)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" ' n; \& j- A+ g5 I3 `
)resp,err:=req.Get("http://127.0.0.1:8000?id=10&title=HttpRequest","address=beijing")ORresp,err:=gotool
9 T H. R' n: p# K .HttpUtils.Get("http://127.0.0.1:8000")resp,err:=gotool.HttpUtils.Debug(true).SetHeaders(map[string]string
& G0 Q! a5 M/ ]0 } {}).Get("http://127.0.0.1:8000")多参数resp,err:=req.Get("http://127.0.0.1:8000?id=10&title=HttpRequest", ' W7 W4 e2 m' x# X- T- h/ u
map[string]interface{}{"name":"jason","score":100,})deferresp.Close()body,err:=resp.Body()iferr!=nil{
7 j) z* M1 x9 |$ G' \; X return}returnstring(body)POST// Send nil
. \: w8 |2 t) \8 N8 v/ q resp,err:=gotool.HttpUtils.Post("http://127.0.0.1:8000")// Send integer4 q( | m+ U' C
( r! C( `% @7 e* T. l b' D
resp,err:=gotool.HttpUtils.Post("http://127.0.0.1:8000",100)// Send []byte$ C4 X) i+ K+ z [. w
resp,err:=gotool.HttpUtils
- c9 C% N$ g, ~ .Post("http://127.0.0.1:8000",[]byte("bytes data"))// Send io.Reader
- t( l. z2 x ]- H; q2 M B resp,err:=gotool.HttpUtils.Post(
5 s/ M% c! M7 Q: k: g "http://127.0.0.1:8000",bytes.NewReader(buf[]byte))resp,err:=gotool.HttpUtils.Post("http://127.0.0.1:8000"
I: t! {% c5 h8 H ,strings.NewReader("string data"))resp,err:=gotool.HttpUtils.Post("http://127.0.0.1:8000",bytes.NewBuffer
1 `. _; U6 N4 J+ R7 e" h% c! i (buf[]byte))// Send string
) H+ d; K2 i2 u$ }. D% a resp,err:=gotool.HttpUtils.Post("http://127.0.0.1:8000","title=github&type=1"
) L) k0 K$ ~2 q7 A1 |- ]0 { )// Send JSON
' w1 G0 q7 A" o resp,err:=gotool.HttpUtils.JSON().Post("http://127.0.0.1:8000","{\"id\":10,\"title\":\"HttpRequest\"}"
. Y1 }8 e0 @+ D9 t+ ^. ` )// Send map[string]interface{}{}
6 J; o) L( m4 d7 Y9 \. X resp,err:=req.Post("http://127.0.0.1:8000",map[string]interface{}{"id" 3 U3 E- u! C. y6 L0 o8 U
:10,"title":"HttpRequest",})deferresp.Close()body,err:=resp.Body()iferr!=nil{return}returnstring(body 8 _: w( _( A4 \' H- y
)resp,err:=gotool.HttpUtils.Post("http://127.0.0.1:8000")resp,err:=gotool.HttpUtils.JSON().Post("http://127.0.0.1:8000"
6 r4 ?/ P8 z+ N4 ^. b ,map[string]interface{}{"title":"github"})resp,err:=gotool.HttpUtils.Debug(true).SetHeaders(map[string
" u5 u2 c. z! }8 ~3 c) j" E ]string{}).JSON().Post("http://127.0.0.1:8000","{\"title\":\"github\"}")代理模式proxy,err:=url.Parse("http://proxyip:proxyport" ( S1 _, ?* P/ o4 h5 j& u, m
)iferr!=nil{log.Println(err)}resp,err:=gotool.HttpUtils.Proxy(http.ProxyURL(proxy)).Get("http://127.0.0.1:8000/ip" % z7 k3 G# L) ^( \
)deferresp.Close()iferr!=nil{log.Println("Request error:%v",err.Error())}body,err:=resp.Body()iferr!= * s6 g" ~5 e: E7 F4 O: x
nil{log.Println("Get body error:%v",err.Error())}log.Println(string(body))上传文件Params: url, filename, fileinput % T3 u) W) T! U- q5 v+ z, w8 p# d' P- q
resp,err:=req.Upload("http://127.0.0.1:8000/upload","/root/demo.txt","uploadFile")body,err:=resp.Body ! y) @" c' J& a+ l2 x- g) f1 j+ k
()deferresp.Close()iferr!=nil{return}returnstring(body)提示模式默认 falsereq.Debug(true)以标准输出打印:[HttpRequest
) s4 b4 C7 Z* B: Y8 P7 b7 x ]-------------------------------------------------------------------Request:GEThttp://127.0.0.1:8000?name=iceview&age=19&score=100# a# W4 Y- }6 x( Q5 y+ E+ j
6 u3 |2 [0 ~5 S. b2 U7 f! { Headers:map[Content-Type:application/x-www-form-urlencoded]Cookies:map[]Timeout:30sReqBody:map[age:19
' ]9 \" B% Z6 a5 e% i score:100]-------------------------------------------------------------------JsonPost JSON 请求设置请求头req ; }' [7 m# O8 \1 D2 B6 I" F
.SetHeaders(map[string]string{"Content-Type":"application/json"})Orreq.JSON().Post("http://127.0.0.1:8000" ! M- N2 {) b U, [1 R9 c& F
,map[string]interface{}{"id":10,"title":"github",})req.JSON().Post("http://127.0.0.1:8000","{\"title\":\"github\",\"id\":10}"
% `4 f" {3 `1 j6 M7 T) \3 H. Z4 O )Post 请求resp,err:=req.Post("http://127.0.0.1:8000",map[string]interface{}{"id":10,"title":"HttpRequest" ' ?' T) k/ L8 s
,})打印格式化的 JSONstr,err:=resp.Export()iferr!=nil{return}解组 JSONvaruUsererr:=resp.Json(&u)iferr!=nil{return
9 t3 W- I, p7 X$ n" K) m: v8 V err}varmmap[string]interface{}err:=resp.Json(&m)iferr!=nil{returnerr}
7 T7 V3 D1 x7 `! d: L
+ O7 m' v& O5 S. `) |' p( B- f/ c/ k6 A+ p! ~/ H/ r
' @/ A6 v7 G0 J8 h: }
; T1 Y- |! Y5 s @; B
|