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

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

[复制链接]
我来看看 发表于 2023-03-09 19:02:26 | 显示全部楼层 |阅读模式
+ h; f' J1 f6 [4 ~9 V

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

% T$ c3 {" h. V( |% F

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

# x; u6 Q& A1 ^' u

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

4 [( L, ~( g( @7 c# D* j; S9 a

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

2 K$ M$ q4 n, W4 G3 e6 C( i# a

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

: ^4 ~% l9 e+ T5 J) _

==nil{fmt.Println(placeholder)}}//out1 u+ Z$ u) z3 |- I$ L- K5 M ===RUNTestStringReplacePlaceholder你是我的唯一,我是你的所有---PASS:TestStringReplacePlaceholder

5 O" p$ ^& D+ ]. J8 A

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

4 }# c2 c( Y3 q9 ~+ Y

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

7 ~( B5 I) J; u+ i2 j* s

suffix,_=gotool.StrUtils.RemoveSuffix(fullFilename)fmt.Println(suffix)}//out + f+ [9 h5 E/ W" m+ C! n ===RUNTestRemoveSuffixtest

, U* w" [1 v. h3 U+ N4 r

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

4 u" |" ~& j- H8 M& F4 r4 G0 `

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

: f& Q$ _3 @+ l2 F8 Y2 g p

="/root/home/test.txt"suffix,_=gotool.StrUtils.GetSuffix(fullFilename)fmt.Println(suffix)}//out* i2 n4 N# j& r" l9 R+ [ ===RUN

! M. j( z `% l+ P5 N3 [

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

9 C1 g! ~& c0 D: b, G4 J% K

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

$ S, A" a' L7 `9 q" M

=gotool.StrUtils.HasEmpty(str)fmt.Println(empty)}//out! d& ?+ Q0 J! F2 L: m ===RUNTestHasStrtruefalse---PASS:TestHasStr(0.00

1 x2 j: j- q# _9 R5 s" h

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

$ w5 Y, P1 k) S4 h4 Q

TestStringToInt64(t*testing.T){//字符串数组转int64" J# _% x% V5 i+ S strings:=[]string{"1","23123","232323"}fmt.Println(reflect

. X9 q. g6 l- j( Z

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

% _ b8 ^) K G5 i( ~& A; g8 b( g

.Println(reflect.TypeOf(toInt64[0]))}//out 1 d/ p! r3 V3 x5 A: j ===RUNTestStringToInt64stringint64---PASS:TestStringToInt64

5 `" F7 s+ @7 a3 t/ g

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

4 C) n7 T4 j, Y G2 B6 \

testing.T){//字符串数组转int64! l. c2 P7 @' q. }# A3 I, u) \ strings:=[]string{"1","23123","232323"}fmt.Println(reflect.TypeOf(strings[0]))

' Q" ^) W5 [; H m( S

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

' n# ~( w( |+ O0 {

(toInt64[0]))}//out ; u v' b& @+ ~8 ^, B' x8 q0 r) K ===RUNTestStringToInt32stringint32---PASS:TestStringToInt32(0.00s)PASS3、gotool.StrArrayUtils.ArrayDuplication 数组去重

9 j+ b, U; Y$ c/ N0 f

funcTestArrayDuplication(t*testing.T){//string数组去重 # j: {' [& g9 L strings:=[]string{"hello","word","gotool","word"}fmt

! [2 P. M3 J- Q8 f) Y2 o: P9 O

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

) S; V' U4 k n7 y2 ]

.Println("去重后----------------->",duplication)}//out 2 t% F* D. C5 i9 m5 _/ q ===RUNTestArrayDuplication去重前----------------->[hello

3 y$ u V6 B" z5 S

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

2 n# f# Z2 H, Z8 d4 J

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

, y$ f& _3 `/ q2 ?9 l9 \

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

" R: Q6 r$ z, @: }

.DateUtil.FormatToString(&now,"YYYYMMDD hhmmss")fmt.Println(toString)}//年月日对应YYYY MM DD 时分秒 hhmmss 可进行任意组合 比如 YYYY hh YYYY-DD hh:mm 等 4 K) J( f5 ?& j' K) E

: ?- o) ~; u* V" Z! z

//out! ~; m- h) @0 V+ o. Z+ S+ Z ===RUNTestFormatToString2021-07-0716:13:3020210707161330---PASS:TestFormatToString(0.00s)PASS2、gotool.DateUtil.IsZero 判断时间是否为空

' e, t4 M9 v# t& `& m! g) @

//时间为空 true 否则 false 6 z& _, _4 M; ~ funcTestDate_IsZero(t*testing.T){t2:=time.Time{}zero:=gotool.DateUtil.IsZero(t2)

* [8 A5 g& M' t

fmt.Println(zero)zero=gotool.DateUtil.IsZero(gotool.DateUtil.Now())fmt.Println(zero)}//out / F3 p ^& u3 h; ] ===RUNTestDate_IsZero

4 i/ V; R0 s T- Z7 Y

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

) b# M# x( c& l/ u. Q

4、gotool.DateUtil.InterpretStringToTimestamp 字符串格式化成时间类型//参数一 需要格式化的时间字符串 参数二 字符串格式,需要和需格式化字符串格式一致4 h& _5 u, p! Q/ Z) u# @$ } //如 2021-6-4 对应YYYY-MM-DD 2021.6.4 对应YYYY.MM.DD ; h# ` d- @; t1 \( z

, ?. X, z" v) t6 y/ J5 Y8 ]7 @- I9 h

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

! W1 ^" ~5 }2 C0 Q7 v. a: ?

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

9 g& H1 L" l$ T j4 O" F3 J

.Println(timestamp)}//out$ M Z N/ _: g) N0 A ===RUNTestInterpretStringToTimestamp1620112379---PASS:TestInterpretStringToTimestamp

3 R' L) Q; a( f$ `: s

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

$ B% b3 p0 O$ z. j, u r* t

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

4 |0 \4 M4 ]7 Q. Z

(toTime)}//out % k. H! [ w" z* e6 L( N0 f ===RUNTestUnixToTime时间戳----------------------->16256456822021-07-0716:14:42+0800CST---

/ r0 P7 A5 G, D% L1 O

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

9 ]: D% U# k* Y6 |! I8 I

gotool.DateUtil.Now()day:=gotool.DateUtil.GetWeekDay(now)fmt.Println("今天是-----------------周",day)}//out 2 D" }- S4 R/ e8 D- y

6 q7 }$ y' W) }, \' q" a

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

0 x) ^( k. C, i+ P

//时间计算: q G. e* U6 B7 c3 ?( F+ {' j funcTestTimeAddOrSub(t*testing.T){now:=gotool.DateUtil.Now()fmt.Println("现在时间是--------------------->"

+ Q8 X4 l0 l' ]' A$ H

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

: U4 b! D8 }2 }7 f# Q) t/ z

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

& V' \5 B, Z0 J5 d9 Q' ^6 ~

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

& L3 k) ]$ a& j9 y7 z3 E, ]

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

9 D' U: E' T, f& L

,sub)sub=gotool.DateUtil.DayAddOrSub(now,-10)fmt.Println("天计算结果-------------------->",sub)}//现在时间是---------------------> 2021-07-07 11:18:17.8295757 +0800 CST m=+0.012278001 * W$ U3 V; z: \, m. r" N& _' s

) P( i/ `( ?& Q$ }1 I0 p6 k

//分钟计算结果--------------------> 2021-07-07 11:28:17.8295757 +0800 CST m=+600.012278001/ r4 J) o' B2 \2 O, ]. f //分钟计算结果--------------------> 2021-07-07 11:08:17.8295757 +0800 CST m=-599.9877219993 o6 q% U1 `8 [0 `* e2 |

3 Z9 P B0 g$ l, ^( p; _7 |- G! }

//小时计算结果--------------------> 2021-07-07 21:18:17.8295757 +0800 CST m=+36000.0122780019 \& R. _. n% B) E9 P //小时计算结果--------------------> 2021-07-07 01:18:17.8295757 +0800 CST m=-35999.987721999) A6 b# F) H7 Q* K3 A( t

9 s( z! Y) z% s! y3 x8 W

//天计算结果--------------------> 2021-07-17 11:18:17.8295757 +0800 CST m=+864000.012278001 3 j2 k2 z; o5 Z6 G- Y //天计算结果--------------------> 2021-06-27 11:18:17.8295757 +0800 CST m=-863999.987721999 1 n5 w3 A! i7 s. b

$ Z, I* H- D+ C1 O

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

, a4 E2 }* k0 n3 f8 s" S

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

, t( ~- i% J6 _2 h: v1 m( h$ X

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

) m. X& e+ ?4 L0 i

false)fmt.Println(gregorian)days:=gotool.ConvertUtils.GetLunarYearDays(2021)fmt.Println(days)}//[2020 1 8]0 [! H( A5 J- J7 g- c% d

5 ^) {; Y: A4 r9 t: f' @* f

//[2020 2 1]; c+ \1 z% V7 n //354 h1 p5 O5 j7 X, } 2、gotool.ConvertUtils.GetSolarMonthDays(2021,7)获取公历某月天数 2021年7月天数3、gotool.ConvertUtils.IsLeapYear(2021)获取某年是否是瑞年 true是 false不是

: U3 h1 u4 f5 ^( l& L

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

8 y# j H& ]# r

2、gotool.BcryptUtils.CompareHash 加密后和未加密密码对比,多用于登录验证使用funcTestGenerate(t*testing.T){//进行加密 5 r3 @; Y: L& x( ?0 r generate:=

' a) C# b( ?" u

gotool.BcryptUtils.Generate("123456789")fmt.Println(generate)//进行加密对比2 o: z7 p; B$ ^2 w2 ?; l hash:=gotool.BcryptUtils.CompareHash

$ c& {0 [8 A5 K% H5 t

(generate,"123456789")fmt.Println(hash)}//out 0 H/ E! \7 }, l0 }6 E ===RUNTestGenerate$2a$10$IACJ6zGuNuzaumrvDz58Q.vJUzz4JGqougYKrdCs48rQYIRjAXcU2

, `8 l% {7 }3 W- T) L. F

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

8 i3 b7 ~' ?4 t

.BcryptUtils.MD5("123456789")fmt.Println(md5)}//out 8 N0 s+ g( v& }- d Q" [) i ===RUNTestMd525f9e794323b453885f5181f1b624d0b---PASS

& X2 f4 G. A+ c( v7 Q# F( D! l q$ K* G

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

8 {7 _3 y$ e* D0 D) i) o

7、RsaEncrypt(公钥加密),8、RsaDecrypt(私钥解密)funcTestRsa(t*testing.T){//rsa 密钥文件产生 3 A/ I. V) u" f( x" o& V fmt.Println("-------------------------------获取RSA公私钥-----------------------------------------"

' g- X0 u$ B: y, ~' C

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

$ e: t6 f; a2 x- ~6 C* z

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

) K q. z% x/ o" {; I( f. u

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

* a# K k( a2 b3 }0 h( L; `

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

, k7 n" y4 x! Q3 X+ ^3 D: x- F6 H

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

9 m+ [/ ^- Z6 R" [" X7 ?

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

* K4 h' [- z8 Z; q K1 {+ H

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

* e, g! s/ W/ S4 v% ?, r' Y

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

* ~1 G% |) U' W4 z u* n6 _( V) a5 V

(sourceData))}//out; n/ b& _# Z" [! K' l. W, ~ ===RUNTestRsa-------------------------------获取RSA公私钥-----------------------------------------

: l3 V) E; f# |4 n

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

R! Y& k4 i; z" t* F' {$ ~2 d

WTNaddCSuxoZpN33mwS82DCjZe3d7nAPdEGD5pSBx6TVt5bG1c3NVAmcBQIDAQABAoGAWc5KO9T0R3xYYzb6Fer0r9GNEzKMxdkTE7zws

5 ~" q+ A9 p% |1 b2 ?9 T

/3Cky4BKyIxN6LIwbLSHinXtCXioTOLaDyrJuqNCbEBsr1NoCIPxnswA5Jm5QDYO5x9aq4u8+SZ9KqLbMrO1JDSZV7Cbiblz1xNMfdVIvlVjD5RdEotbYTbHI2CZUoPsjHng8kCQQDHi6TJYJqvej8r

# y- F$ @4 R2 V# @

q46ZceuWHDgE81Wu16RrA/kZKi6MJAApQtfO/4HM6W/ImbCjZ2rSYxqnAlIg/GxAdT6iJABjAkEAzWra06RyhGm3lk9j9Xxc0YPX6VX7qT5Iq6c7ry1JtTSeVOksKANG

" M7 H% W$ u E% j

elaNnCj8YYUgj7BeBBcMMvLd39hP1h06dwJAINTyHQwfB2ZGxImqocajq4QjF3VuEKF8dPsnXiOZmwdFW4Sa+30Av1VdRhU7gfc/FTSnKvlvx

9 M) E, H8 \9 `2 n- m

+ugaA6iao0f3wJBALa8sTCH4WwUE8K+m4DeAkBMVn34BKnZg5JYcgrzcdemmJeW2rY5u6/HYbCi8WnboUzSK8Dds/d7AJBKgTNLyx8CQBAeU0St3Vk6SJ6H71J8YtVxlRGDjS2fE0JfUBrpI

# y* C) i' i& s6 K6 R* ] S/ I$ u+ D) `

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

3 M* F4 w: O; [

ov8KqyMtHa+GauF121dperr3i46JyDoskoSBhbkmqv70LMNrjqVdttdIsC0BtH9ThWLBwKVLH56EqfzqlzClKZEhWTNaddCSuxoZpN33mwS82DCjZe3d7nAPdEGD5pSB

4 Q1 x3 W+ Z: E; l$ E6 r

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

3 [+ |* Z5 C* m$ R

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

% A8 T2 g) N, C6 G% b9 \1 q. a

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

4 K* T! [9 s4 F3 W! T

公钥加密后的数据:637b05798c1cf95cfcc63adf228645c77f8e9a9f34b12b722e6938ded8c9560a0430171a4f940d3fb2d96bc6c470c80a817d81f4a2669b991adbff5b22b335129e514c921083ce3e64c1c876409d9b763d5e8e269797283ef951a364da6a59a1d8454391356cb0cd0808092e9dd7ac371f9247a43760f3c82b7ad26a32a7a807

! A7 _7 O* v1 q2 J/ n4 @% }0 F9 v

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

# J$ y& P. j3 i8 U5 K9 s7 G9 F4 c

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

+ a( Z0 G) J# j f4 ^

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

4 k* Y+ j0 |0 L2 F# }3 b5 ~

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

7 B, J: d/ w+ a0 `, F9 T

("压缩成功")}}//out J0 ]! t7 V; X4 K! l ===RUNTestCompress压缩成功---PASS:TestCompress(0.12s)PASS2、gotool.ZipUtils.DeCompresszipFile 压缩包路径

# A" C- q9 G* H

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

6 F% H( R, h; V/ P

,"/Users/fanyanan/Downloads")iferr!=nil{t.Fatal(err)}ifcompress{fmt.Println("解压成功")}}//out8 f e6 u2 b$ V! S" g ===RUNTestDeCompress

! O* T$ @1 O8 K5 R- R2 v

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

! U& R3 V: [2 d( P% F

funcTestFileExists(t*testing.T){//判断文件或目录是否存在 7 U' L( S( t& h' q6 Z. i$ q exists:=gotool.FileUtils.Exists("F:/go-test/test")fmt.Println

' c' t" a0 Q4 w i* F

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

; [) S' \* [& q! C5 R7 s

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

3 a/ `3 I, W( @" t, f5 p

)}//out 5 `9 ~9 m" J9 j2 }/ h x ===RUNTestFileExists创建前------------------------>false创建后------------------------>true---PASS:

4 P/ Z& D) a9 f- b( `

TestFileExists(0.00s)PASS2、gotool.FileUtils.IsDir 判断是否是目录funcTestIsDir(t*testing.T){//判断是否是目录 - a0 k4 V7 s4 k! U dir:=gotool

9 u( {/ h' u, V4 j* |

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

) o8 c! F6 i1 H

.IsDir("F:/go-test/test/test.txt")fmt.Println("是否是目录--------------------->",dir)}//out. G9 }" B* J* d# e$ _2 z+ s ===RUNTestIsDir

: M( h N6 M/ I) v

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

; b9 k6 ?; Y& r, l! |# @

funcTestIsFile(t*testing.T){//判断是否是文件9 U9 f: W! @# R0 F) }- a. k file:=gotool.FileUtils.IsFile("F:/go-test/test")fmt.Println("是否是文件--------------------->"

' M+ H. Y9 m( D! H( C

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

8 X( F; j1 ?+ [ g; ?* @

,file)}//out% I& u5 f3 m4 S7 B6 P$ A! l5 T& l ===RUNTestIsFile是否是文件--------------------->false是否是文件--------------------->true---PASS:TestIsFile

, B( l7 |# s9 n# |4 r6 c3 F: T+ {

(0.00s)PASS4、gotool.FileUtils.RemoveFile 删除文件或目录funcTestRemove(t*testing.T){//删除文件 & k/ L! y0 P6 O- T4 b4 m file,err:=gotool.FileUtils

! r) n) j$ _, \8 N& y5 k1 r1 A

.RemoveFile("F:/go-test/test/test.txt")iferr!=nil{t.Fatal(err)}iffile{//查看文件是否还存在/ P& V3 g8 r# N! m exists:=gotool.FileUtils

( e1 ?9 H- n! f" y& h' v

.Exists("F:/go-test/test/test.txt")fmt.Println("文件是否存在------------------------>",exists)}}//out& o5 w* \2 D" ?0 l; b: O& `6 J- W ===RUN

4 `& ~ w7 z3 I( H$ x

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

4 p5 c+ o, e! H

funcTestOpenFileWronly(t*testing.T){//用只写模式打开一个文件,并且写入5条内容,若文件不存在将会创建一个" o- X6 X- T V/ l/ Q: X2 h path:="F:/go-test/test/test.txt"

6 _) ^- l/ l6 A5 E U1 t B

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

8 W2 b: F: w: Z+ E

wronly.Close()write:=bufio.NewWriter(wronly)fori:=0;i<5;i++{write.WriteString(str)}//Flush将缓存的文件真正写入到文件中4 Q( E/ a% r+ c

" Q: e1 ]0 o2 }

write.Flush()//读取文件写入到控制台4 w6 V- U7 d! Z8 O files,err:=gotool.FileUtils.OpenFileRdonly(path)iferr!=nil{t.Fatal(err)}defer

, o; N% L4 m/ r2 M# ?" _

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

* B0 |9 b2 `% Z

(str)}}//out 3 G4 h) |" d6 o, F2 J ===RUNTestOpenFileWronlyhellowordgotoolhellowordgotoolhellowordgotoolhellowordgotoolhello

4 o1 z* R! {3 V- n& T: q6 h

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

: \6 D# J$ s. J8 b/ T) T

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

( T' h6 ]8 t/ C

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

+ z8 g) U: f( z

(\n)iferr!=nil{break}fmt.Print(str)}}//out& |, V7 [! g, U2 G1 I/ x, L ===RUNTestOpenFileRdonlyhellowordgotoolhellowordgotoolhello

; R/ \; x+ n; W# \

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

4 Y4 n3 P! N4 R/ ?: ^

funcTestOpenFileAppend(t*testing.T){//打开文件在文件后面追加数据 4 }4 N. U7 t0 m5 X5 G path:="F:/go-test/test/test.txt"str:="追加内容 \n"wronly

6 f2 F$ c# Q- Z2 t! A

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

" M' V/ h6 s% a8 ?

(wronly)fori:=0;i<5;i++{write.WriteString(str)}//Flush将缓存的文件真正写入到文件中 / G3 C4 j4 T. ^1 ~3 w! `6 O' l I write.Flush()//读取文件写入到控制台 , e+ M# H" Z' T: f4 r files,

( k* _/ d! t% O4 h5 Q8 q

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

. ^7 ~" S7 e" a: h( {& B7 v

(files)for{str,err:=reader.ReadString(\n)iferr!=nil{break}fmt.Print(str)}}//out; k$ {3 E6 q' B" Y ===RUNTestOpenFileAppend

" K- V+ U8 O5 P* ~/ h& I! ]7 S6 x

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

- F1 K: @9 N6 o* W

:TestOpenFileAppend(0.00s)PASS8、gotool.FileUtils.FileCopy 文件复制方法funcTestFileCopy(t*testing.T){//文件复制功能 ! S, U. s" Y9 e

& W2 n! { @3 Z2 i9 W, R

path:="F:/go-test/test/test.txt"copyPath:="F:/go-test/test/test.txt1"//复制钱. V1 |; n% i" K2 _ exists:=gotool.FileUtils.Exists

, X. Q9 n. b: F6 q' n7 K7 W

(copyPath)fmt.Println("复制前文件是否存在------------------>",exists)//复制后 0 ^0 v9 @" Q1 A: w fileCopy,err:=gotool.FileUtils.FileCopy

9 ^) i. r: o7 g

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

! i0 u; ^5 n0 V* O% ^* s+ M

("复制前文件是否存在------------------>",exists)}}//out - N- S5 r" m& F R ===RUNTestFileCopy复制前文件是否存在------------------>false复制前文件是否存在

! }# D8 v3 d. r$ _( @

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

: _9 W: q0 l" ?3 F+ E2 X" B

funcTestCaptcha(t*testing.T){//生成验证码字符串,可以进行redis等存储用于验证逻辑 9 d. w, w/ p ?8 R" o) H2 N2 h% m3 F str:=gotool.CaptchaUtils.GetRandStr(6)fmt.

: Q* G6 s' N2 ?7 ]. L

Println(str)}//out+ P$ [ y; h/ {5 |+ `0 O ===RUNTestCaptcha生成验证码字符串------------------->qK5DME---PASS:TestCaptcha(0.01s)PASS2、gotool.CaptchaUtils.ImgText 生成图片[]byte数组,可以转成base64或者image文件

7 q& t$ Z' d! ?

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

" W8 U6 v {8 o5 s5 W0 h

,str)//生成图片byte数据,可以根据需要转成base64或者是image图片文件( _5 `( s; s# z text:=gotool.CaptchaUtils.ImgText(100,40,str)sourcestring

, N% _% A. N4 X

:=base64.StdEncoding.EncodeToString(text)fmt.Println(sourcestring)}//out4 N/ |0 ^( n/ i9 H ===RUNTestCaptcha生成验证码字符串-------------------

/ g, @( m' z2 |7 U

>qK5DMEiVBORw0KGgoAAAANSUhEUgAAAGQAAAAoCAYAAAAIeF9DAAAbcUlEQVR4nOx6B3Rc1bX2PuXeO6MZjUaj3nu15SbLHWNjcIuN8SMYjAMYnPZCebz3QscQWmiPFFoCoRhCCAaDzcPGxrjLlnuTrGJJltW7ZkbSaGZuO

# u( q3 V- I7 R8 p( K( p5 A8 K

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

. I9 b0 p, ^+ J

/BvnOgDi7u9Avf3ev9Mzbz0lev/c7K9Ht6kYP3PmYyfgU7thPv+t4/2zynQFJikli655b6zOur7v3BnPh8b3fWom6rqOiXQfJls92kJNHT2Gf1

( Z1 O; e* |* ?- I* p. i3 C& h) p

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

7 c' ^" P- ]3 z

/JOLrO4NihEuLp8aDImAhud4SM6P2hRNEUpOgqyEwFv+pDsiaDrClI1VSQdRlk1Y9UXw9SmQYyoXzgeV0BWZORX5NB0RVQNRUZ/zt

8 w7 h) @' ]: _" {

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

5 Z: O+ [0 U7 P" a

/0vrKvCR0uNEUVQQ7BSO+E+QkwdKiHxukaomo/PXiiYj1VCyoWBVPqcIQ4kqUs8rjmmI88GYSowjE+dg5hyMb6GmDyDeDKAyqLGIoAv4OxsBRpibBRMXiQAilfq

5 O" X! ?8 O. d, |

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 - x& P- Z2 W7 c4 O

/ u: M; { L1 W% s M

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

t$ p$ m# \' j9 }: n

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

2 [3 {2 ~" I5 h% b

)gotool.Logs.DebugLog().Println("Debug日志测试")}//out3 y/ J& \, |: _1 \/ a, v% a; v ===RUNTestLogs[ERROR]2021/07/0715:58:10logs_test.go

; S/ T6 i( \: k- W7 W; x5 |

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

. l X$ B% H; ?* v. g

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

, \& @0 L. l1 m. V; |5 g

.T){paginator:=gotool.PageUtils.Paginator(5,20,500)fmt.Println(paginator)}//out( q" X6 H. h6 u8 H- ?( b' V; g ===RUNTestPagemap[AfterPage

' S" V: b4 X+ U+ U: P! Z* s

:6beforePage:4currPage:5pages:[34567]totalPages:25]---PASS:TestPage(0.00s)PASS//说明 AfterPage 下一页 beforePage前一页 currPage当前页 pages页码 totalPages总页数8 v+ t7 h. i O! m, N+ J

/ q- ], f( O# }" F0 Y8 {8 i9 U

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

2 ^. N3 }& @1 R1 n& }" J* O

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

' b# D8 W4 W% j: t; g* E W

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

& h" E1 H4 \4 C, b" j1 t' O

,time)}}//out 2 @. N& W! H, U ===RUNTestUUID根据时间生成UUID去除--------------------->------>6fb94fe4dfd511ebbc4418c04d462680

1 S) g" Z, |* v& U

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

1 t' [% ` y* R6 Z

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

* V. o3 E+ ^) C' s% G' @

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

0 j, X: W7 z; v9 H/ y

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

& x; v* a2 ?# b+ u) [* D- J0 `

)}//out % ^: F/ ]+ i( O0 Y0 v ===RUNTestUUID根据随机数生成UUID去除--------------------->------>cf5bcdc585454cda95447aae186d14e6根据随机数生成不去除

_, {8 ]5 A- K k8 s5 S! [

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

- ~; S. y) @2 T3 x7 d0 o

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

$ N d5 a) q* `, \8 B- ?9 Q6 u' p

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

3 S. v7 D$ k" h. @' s! B

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

' {0 C( Y, i6 @2 T0 r

,captcha)}//out7 j0 S0 ~8 ]+ ^4 }3 z7 d, y ===RUNTestCreateCaptcha18位------------------------------------------>492457482855750014

% |. i; S6 s; D# g

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

" B$ X0 z3 V2 z. Z) `# N

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

~8 [3 n# z0 t$ [) p

,work)}//out3 G& i6 P& C' z! R; T; E( b ===RUNTestGetIdWork根据时间戳在加以计算获取int64类型id-------->1625746675366450---PASS:TestGetIdWork(0.00

. n2 t$ Z3 F! ~* p6 G! J* N1 y( |

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

: `" Y3 D6 @, z% G( k

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

* T8 \3 _3 u* U: H& M

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

6 Z0 u* V% Z) ]

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

% m1 A) k8 c I2 |0 A+ T: B

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

; J) ~2 U8 ] }; X& D I7 E

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

* l0 t# f: E C& U6 y

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

( M( i9 \! e/ ~& P* [6 n+ x

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

1 m( N; @. ~) F) v1 l. z9 ^! K

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

, m2 v# `9 o0 }

(5)//default 30s% W# @3 M' A, P( k 面向对象的操作模式req:=gotool.HttpUtils.NewRequest().Debug(true).SetHeaders(map[string]string

4 e& y l, |3 U; x! W% s

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

8 e1 @* a! ~( j7 F7 e

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

! i/ a0 `% T$ g _

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

& W \: g! U+ {6 U

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

: @3 ^/ q: y/ s; m( a7 }! X) W0 z

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

3 V! w7 a1 ~9 V! |1 Z- e

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

5 M- Q) T! c5 I& r) c, w

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

9 J/ t% c8 c- ^1 ], D6 b" Y

return}returnstring(body)POST// Send nil+ l( Z' v+ Y6 M resp,err:=gotool.HttpUtils.Post("http://127.0.0.1:8000")// Send integer ; ?; R& ?# ]6 s

# U8 \( J* B& [% G0 T

resp,err:=gotool.HttpUtils.Post("http://127.0.0.1:8000",100)// Send []byte( ~) N& D% Z4 h) @ resp,err:=gotool.HttpUtils

, N5 j3 T1 M) G; L% K2 `' _

.Post("http://127.0.0.1:8000",[]byte("bytes data"))// Send io.Reader$ C. d# D! Q# J; R, a resp,err:=gotool.HttpUtils.Post(

1 L" n& d, n% y m

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

" y) E3 k3 ?! Q8 O5 [& u- O/ t

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

5 q+ P9 w6 D3 j+ j) I/ l8 o2 f1 L

(buf[]byte))// Send string : @, y7 u# D) C1 B' }+ K1 y resp,err:=gotool.HttpUtils.Post("http://127.0.0.1:8000","title=github&type=1"

( ]6 O* x U+ l, A6 p

)// Send JSON7 ^3 v1 E( t& q4 O# I& P0 u+ N resp,err:=gotool.HttpUtils.JSON().Post("http://127.0.0.1:8000","{\"id\":10,\"title\":\"HttpRequest\"}"

# m2 X3 p1 N3 K9 @. V2 Q

)// Send map[string]interface{}{}- u& }( G( ^ [, b& m1 F resp,err:=req.Post("http://127.0.0.1:8000",map[string]interface{}{"id"

: L- \+ D% \! I- ^) V

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

" y4 D: P) B. }4 z

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

( o; ?& D4 m6 z/ F7 I

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

B; O- Z i: F4 w

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

% o, ]. E1 @3 ]

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

) [+ O/ L( Q& p

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

8 }' f' O" q# D1 i" g6 R# c* u# E8 Z! u

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

7 H2 v9 y* v* {! K2 N

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

+ {/ [, c$ @) I0 M. R% ^+ C

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

+ C9 o: h$ Y9 {, y3 P2 m5 d

]-------------------------------------------------------------------Request:GEThttp://127.0.0.1:8000?name=iceview&age=19&score=100 9 b1 j7 H7 ^8 |/ D# T9 u" r7 G

$ \6 a; {6 k0 R q

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

) M& H0 V! }$ k" j+ H* [

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

5 F8 J: y( B! H3 e) p) y* R H

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

! _% v& y* Y4 y- B$ ?

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

; ? \+ a8 X, l# S2 e- h

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

& z( ?* A" j0 D

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

3 ^( T3 I0 k9 J( t

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

7 G% M, }( R: }) l, z ( f" k! U4 c$ d# z9 P+ ~ Z/ I: u7 ~1 }# q& ~/ n3 ^& F$ F% Q0 ]+ l : D4 c: F$ T0 k5 P% e0 }

暂时无法加载帖子列表

回复

使用道具 举报

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

使用道具 举报

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

    本版积分规则

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

    GMT+8, 2026-10-1 16:31 , Processed in 0.056555 second(s), 24 queries , Gzip On.

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

    Powered by Discuz! X3.5

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