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