找回密码
 加入怎通
查看: 238|回复: 2

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

[复制链接]
我来看看 发表于 2023-03-09 19:02:26 | 显示全部楼层 |阅读模式
$ b( C" _# R$ o$ o0 k

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

7 O/ W X$ x8 a

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

) K7 @. f; Q5 Y. X' B

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

$ N+ G' U) {, a. J

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

$ W9 n0 A, C' q

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

/ V J# ]( \7 ]8 A

==nil{fmt.Println(placeholder)}}//out2 r" u1 { C! [, G( s6 \) q: J ===RUNTestStringReplacePlaceholder你是我的唯一,我是你的所有---PASS:TestStringReplacePlaceholder

0 M5 X6 Q: _, J/ ]7 q. B' t- O

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

* \( w0 w' ^* L1 a% }

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

0 V4 Q# r l5 v4 B8 F& [' i

suffix,_=gotool.StrUtils.RemoveSuffix(fullFilename)fmt.Println(suffix)}//out - B; n8 g7 {: j+ H8 a ===RUNTestRemoveSuffixtest

3 g c3 M9 l$ w1 S0 c% Z7 L

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

$ C7 B% A. m# O

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

* k) j: j1 f! P

="/root/home/test.txt"suffix,_=gotool.StrUtils.GetSuffix(fullFilename)fmt.Println(suffix)}//out ! A' T7 n' S$ z/ |: I ===RUN

: e# ]5 }$ W: Y _: `2 `. M

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

" c M7 O4 O0 V- ^- K

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

6 e7 _2 P! L, y' u# d

=gotool.StrUtils.HasEmpty(str)fmt.Println(empty)}//out! @# p& I( L/ j$ W/ O ===RUNTestHasStrtruefalse---PASS:TestHasStr(0.00

% B" }. P( q) ]% m% B7 J9 o9 e n

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

. Z# L; b3 v: @" o+ s1 |) J. f

TestStringToInt64(t*testing.T){//字符串数组转int64 4 O' B% s7 W0 h8 z0 h/ t strings:=[]string{"1","23123","232323"}fmt.Println(reflect

1 A5 c; _+ J$ [

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

0 ^8 o ?3 i O5 Y; t! d3 n, e

.Println(reflect.TypeOf(toInt64[0]))}//out* G: h6 O9 A! t+ H0 M: h9 a ===RUNTestStringToInt64stringint64---PASS:TestStringToInt64

! ^* |$ b2 O" y( M" \

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

3 W$ R/ A W+ L! j' q. O

testing.T){//字符串数组转int64 0 d5 t& s6 S1 n" ]5 r strings:=[]string{"1","23123","232323"}fmt.Println(reflect.TypeOf(strings[0]))

% r! k- e& Y6 m

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

( C3 ]& ~: w5 j: g% J& S

(toInt64[0]))}//out2 W# C5 K& C, w& M4 H7 ~ ===RUNTestStringToInt32stringint32---PASS:TestStringToInt32(0.00s)PASS3、gotool.StrArrayUtils.ArrayDuplication 数组去重

6 X* \+ h2 c; Q% K! r

funcTestArrayDuplication(t*testing.T){//string数组去重 0 i$ q$ o- ~- l2 M strings:=[]string{"hello","word","gotool","word"}fmt

) ?0 [6 r! y: V8 p0 E

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

k' ]$ e5 _: W: m3 i: g) d

.Println("去重后----------------->",duplication)}//out 6 i$ m* H. K. y9 j+ d; C ===RUNTestArrayDuplication去重前----------------->[hello

! U4 l& Y: A* k, `' `

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

" h; }0 V8 w& W* z1 n: y& v" D0 G7 S. E

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

4 @$ o/ m; z$ U' t

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

5 D0 n, F) J" B

.DateUtil.FormatToString(&now,"YYYYMMDD hhmmss")fmt.Println(toString)}//年月日对应YYYY MM DD 时分秒 hhmmss 可进行任意组合 比如 YYYY hh YYYY-DD hh:mm 等. o% y2 z( J% |; }$ P

& i4 s( K) l- C% s

//out ; a5 M* r {8 @7 Q ===RUNTestFormatToString2021-07-0716:13:3020210707161330---PASS:TestFormatToString(0.00s)PASS2、gotool.DateUtil.IsZero 判断时间是否为空

! Y1 @0 G; }. S; d; N

//时间为空 true 否则 false & H6 d( o6 J9 Z$ ]1 Y$ U funcTestDate_IsZero(t*testing.T){t2:=time.Time{}zero:=gotool.DateUtil.IsZero(t2)

$ D8 V+ L- U3 \3 t8 W$ B

fmt.Println(zero)zero=gotool.DateUtil.IsZero(gotool.DateUtil.Now())fmt.Println(zero)}//out + a) V) v' j) h8 F; t/ c8 j ===RUNTestDate_IsZero

# [+ d( W' i' Y% g+ C

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

8 N: B; W; G2 Y" |$ i5 c

4、gotool.DateUtil.InterpretStringToTimestamp 字符串格式化成时间类型//参数一 需要格式化的时间字符串 参数二 字符串格式,需要和需格式化字符串格式一致 b- W1 F4 b' U9 U. P$ n //如 2021-6-4 对应YYYY-MM-DD 2021.6.4 对应YYYY.MM.DD . {. X X- m+ _1 R+ G

E% A$ j& u: o% O

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

* O% e6 Q9 Q" t# e1 q6 H

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

3 `, r4 U2 D% R4 I! C3 |

.Println(timestamp)}//out $ J! o2 a5 g& Q. Q ===RUNTestInterpretStringToTimestamp1620112379---PASS:TestInterpretStringToTimestamp

. u2 f# M% v1 i' l/ u! `0 h$ Z# M

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

9 J7 B, q) t) \" R4 I

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

5 f( H) r- a+ r1 A

(toTime)}//out 3 m7 f8 i* @4 v ===RUNTestUnixToTime时间戳----------------------->16256456822021-07-0716:14:42+0800CST---

, p% M( K: l$ t! X& z5 K

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

* Y" |7 |4 \7 L' J* Q( ~

gotool.DateUtil.Now()day:=gotool.DateUtil.GetWeekDay(now)fmt.Println("今天是-----------------周",day)}//out) o8 e$ O6 E: ^; \3 j. ~

$ b1 B z" l' ^: P

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

0 L5 @& K$ x" r! A) `0 x0 |

//时间计算3 b% S+ J8 A, l funcTestTimeAddOrSub(t*testing.T){now:=gotool.DateUtil.Now()fmt.Println("现在时间是--------------------->"

+ S4 v( J# @2 T% N

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

: G* e7 |3 c5 r$ U0 T1 s* X

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

4 W% v; a( R" P( P( t

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

! _) S3 T# d( m, \/ U" E

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

$ K6 ?; w: z' ^$ a% Y; B2 y

,sub)sub=gotool.DateUtil.DayAddOrSub(now,-10)fmt.Println("天计算结果-------------------->",sub)}//现在时间是---------------------> 2021-07-07 11:18:17.8295757 +0800 CST m=+0.012278001 " E& t4 h! u( e( T

6 @6 y7 E7 q: Q* c2 I

//分钟计算结果--------------------> 2021-07-07 11:28:17.8295757 +0800 CST m=+600.012278001 * m1 e, V& V4 M5 ^1 Y- j* q: x //分钟计算结果--------------------> 2021-07-07 11:08:17.8295757 +0800 CST m=-599.987721999* S5 n# y" ^0 J' `/ Z

( a3 X; K- s8 r; j: j* {

//小时计算结果--------------------> 2021-07-07 21:18:17.8295757 +0800 CST m=+36000.012278001+ P' c# n0 k r1 c2 j( w, s. K //小时计算结果--------------------> 2021-07-07 01:18:17.8295757 +0800 CST m=-35999.987721999 6 i9 d t/ {: ~0 Y. _

9 N2 O4 `& v& K8 Y6 T" V

//天计算结果--------------------> 2021-07-17 11:18:17.8295757 +0800 CST m=+864000.012278001( b8 ]9 l( }, [/ \ //天计算结果--------------------> 2021-06-27 11:18:17.8295757 +0800 CST m=-863999.987721999 ( h; d. F `7 f0 Y

' t" t; e5 y u# h6 _. n

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

* p6 |0 \! t4 h" k& d$ t' T

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

, T3 r% B# w9 P6 Q- D4 _/ T4 K+ c

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

* T: Y8 W9 @; C. v( k

false)fmt.Println(gregorian)days:=gotool.ConvertUtils.GetLunarYearDays(2021)fmt.Println(days)}//[2020 1 8]/ L2 [7 K/ ^# E0 X4 m# d( `

4 ?: z0 e. d. O7 v! X

//[2020 2 1]4 D5 o. b8 b7 y! | //354 " ]( h, J: L. O( ^+ ^1 l: W 2、gotool.ConvertUtils.GetSolarMonthDays(2021,7)获取公历某月天数 2021年7月天数3、gotool.ConvertUtils.IsLeapYear(2021)获取某年是否是瑞年 true是 false不是

* ^9 | e7 A3 `* A

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

& T8 J. Z0 N6 R% {, G

2、gotool.BcryptUtils.CompareHash 加密后和未加密密码对比,多用于登录验证使用funcTestGenerate(t*testing.T){//进行加密 ! d9 U# n; J7 S4 \! [2 |4 P$ B" ? generate:=

! A( e' @8 ^& n% k& N4 t

gotool.BcryptUtils.Generate("123456789")fmt.Println(generate)//进行加密对比 ! J" K! t8 k0 B+ y8 ]$ r0 r+ I hash:=gotool.BcryptUtils.CompareHash

- ~. U, M) y' F$ ~+ E- X! B9 Y7 L

(generate,"123456789")fmt.Println(hash)}//out3 f" X; ?, u/ k" y( i- g2 u3 U0 M( s ===RUNTestGenerate$2a$10$IACJ6zGuNuzaumrvDz58Q.vJUzz4JGqougYKrdCs48rQYIRjAXcU2

7 r6 g0 M7 L X5 `% i4 _- Y

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

& ]$ B7 X! W8 T

.BcryptUtils.MD5("123456789")fmt.Println(md5)}//out, Y2 x. j: h7 F1 u0 R- U2 a8 P0 y ===RUNTestMd525f9e794323b453885f5181f1b624d0b---PASS

0 Q* ~: `) Z/ D$ X' f

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

6 \# m1 W$ k2 R

7、RsaEncrypt(公钥加密),8、RsaDecrypt(私钥解密)funcTestRsa(t*testing.T){//rsa 密钥文件产生 _ ]1 e- y x! d% O fmt.Println("-------------------------------获取RSA公私钥-----------------------------------------"

* z0 P W# I. I1 G/ V" P

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

: ~$ _- A7 }; R. u! E% |

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

0 }" D9 ^( s6 y$ C) N4 Q/ z

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

& l8 @/ ~* n& _" }2 B8 _

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

+ m7 x) B4 {; f$ [! h

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

- p1 X0 V3 p$ ~1 [1 ^

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

: y- H# |' B( Y( t7 `1 ]7 J! @* e

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

' c8 e# W; j4 U. L- L

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

1 J, X8 j; o9 q; X, P3 \5 W6 ^+ c

(sourceData))}//out3 g% h# {2 O* ?8 p ===RUNTestRsa-------------------------------获取RSA公私钥-----------------------------------------

5 S, V" n+ O. Z* O2 p; J

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

* B! O: v2 k( \+ i$ S$ J7 j

WTNaddCSuxoZpN33mwS82DCjZe3d7nAPdEGD5pSBx6TVt5bG1c3NVAmcBQIDAQABAoGAWc5KO9T0R3xYYzb6Fer0r9GNEzKMxdkTE7zws

7 A9 E& [1 Y3 r# Y; j$ v8 W2 Y

/3Cky4BKyIxN6LIwbLSHinXtCXioTOLaDyrJuqNCbEBsr1NoCIPxnswA5Jm5QDYO5x9aq4u8+SZ9KqLbMrO1JDSZV7Cbiblz1xNMfdVIvlVjD5RdEotbYTbHI2CZUoPsjHng8kCQQDHi6TJYJqvej8r

s- Y6 S M5 M' f! M9 s3 z1 g

q46ZceuWHDgE81Wu16RrA/kZKi6MJAApQtfO/4HM6W/ImbCjZ2rSYxqnAlIg/GxAdT6iJABjAkEAzWra06RyhGm3lk9j9Xxc0YPX6VX7qT5Iq6c7ry1JtTSeVOksKANG

4 g' q& {1 V& {' J% _

elaNnCj8YYUgj7BeBBcMMvLd39hP1h06dwJAINTyHQwfB2ZGxImqocajq4QjF3VuEKF8dPsnXiOZmwdFW4Sa+30Av1VdRhU7gfc/FTSnKvlvx

: w9 Y% |; ~, K' K4 _

+ugaA6iao0f3wJBALa8sTCH4WwUE8K+m4DeAkBMVn34BKnZg5JYcgrzcdemmJeW2rY5u6/HYbCi8WnboUzSK8Dds/d7AJBKgTNLyx8CQBAeU0St3Vk6SJ6H71J8YtVxlRGDjS2fE0JfUBrpI

* f7 V9 c4 Q$ i4 I1 S

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

8 }2 n# U0 s+ ]% m

ov8KqyMtHa+GauF121dperr3i46JyDoskoSBhbkmqv70LMNrjqVdttdIsC0BtH9ThWLBwKVLH56EqfzqlzClKZEhWTNaddCSuxoZpN33mwS82DCjZe3d7nAPdEGD5pSB

8 G- C6 A! w3 k7 H/ W

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

: ? `+ p' m" V1 Z+ S+ S

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

! q! }& A+ [% }; x" O* u

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

. N7 ~6 I& d$ Y. t$ d" E

公钥加密后的数据:637b05798c1cf95cfcc63adf228645c77f8e9a9f34b12b722e6938ded8c9560a0430171a4f940d3fb2d96bc6c470c80a817d81f4a2669b991adbff5b22b335129e514c921083ce3e64c1c876409d9b763d5e8e269797283ef951a364da6a59a1d8454391356cb0cd0808092e9dd7ac371f9247a43760f3c82b7ad26a32a7a807

) c8 A6 z9 [# f5 Z" j

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

' J1 Z5 s9 t0 E( `

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

V5 ]! v0 H1 y- j% Y* [1 f! L

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

9 ^" P6 S! b. A: |: A3 W5 @

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

# D* p9 N" ?3 q

("压缩成功")}}//out9 ]! H% u& S( Z* q ===RUNTestCompress压缩成功---PASS:TestCompress(0.12s)PASS2、gotool.ZipUtils.DeCompresszipFile 压缩包路径

, Q3 j3 o7 W% @: s# d; N

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

$ Z8 B& H0 c4 T& s7 C7 ?* s: w

,"/Users/fanyanan/Downloads")iferr!=nil{t.Fatal(err)}ifcompress{fmt.Println("解压成功")}}//out ( }8 y" w! o6 q( g8 L+ @: F ~. G ===RUNTestDeCompress

" P* Z% |" D& h; `3 F2 W

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

$ Z! e2 U5 S6 v* o

funcTestFileExists(t*testing.T){//判断文件或目录是否存在 3 f4 Z" c/ Z, m( q) O exists:=gotool.FileUtils.Exists("F:/go-test/test")fmt.Println

4 s6 `4 g: A& c7 n9 O2 i% {

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

. M: M$ H( s4 O% O

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

1 y, j2 _; I9 P

)}//out 5 I' ~( b$ B" r8 T: n8 T ===RUNTestFileExists创建前------------------------>false创建后------------------------>true---PASS:

' Z( M" g3 e) Q/ Q. L

TestFileExists(0.00s)PASS2、gotool.FileUtils.IsDir 判断是否是目录funcTestIsDir(t*testing.T){//判断是否是目录/ R* u: m7 _* P& u$ R% w' x/ l dir:=gotool

8 }& Q# d, q& v3 D2 s8 P; |- J

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

1 x# N( q( |5 w+ v, `8 Z' r

.IsDir("F:/go-test/test/test.txt")fmt.Println("是否是目录--------------------->",dir)}//out) X5 D$ u) B3 z! ? ===RUNTestIsDir

5 Q2 j9 |; w" ?- K' q

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

" k) U1 G) w6 H; c ^5 N9 s

funcTestIsFile(t*testing.T){//判断是否是文件" J, b+ @% _3 g- d3 ` file:=gotool.FileUtils.IsFile("F:/go-test/test")fmt.Println("是否是文件--------------------->"

: L7 f+ ^, P0 x5 S

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

U3 B' ^$ z2 u( G& X0 ?% m% k

,file)}//out% ~ G# X i4 D; c, m7 J5 { ===RUNTestIsFile是否是文件--------------------->false是否是文件--------------------->true---PASS:TestIsFile

/ `( q% {, z3 E3 }

(0.00s)PASS4、gotool.FileUtils.RemoveFile 删除文件或目录funcTestRemove(t*testing.T){//删除文件4 L7 t2 }8 q8 `/ E5 l1 N/ O file,err:=gotool.FileUtils

' J* J% |, U: V; n

.RemoveFile("F:/go-test/test/test.txt")iferr!=nil{t.Fatal(err)}iffile{//查看文件是否还存在 " K) K: e+ N: q( v1 ~" p6 ? exists:=gotool.FileUtils

& C; I+ F5 g* M7 A" ^1 Q# m

.Exists("F:/go-test/test/test.txt")fmt.Println("文件是否存在------------------------>",exists)}}//out * Q5 S+ D. m3 ? ===RUN

; |$ X; q3 m& y" @

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

) p% a3 }; ?% d$ }/ a' _6 e

funcTestOpenFileWronly(t*testing.T){//用只写模式打开一个文件,并且写入5条内容,若文件不存在将会创建一个 2 g3 Z/ w. z3 w path:="F:/go-test/test/test.txt"

8 w3 i7 F I' @% g( k1 \2 Q

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

' f) m1 q' s M" c

wronly.Close()write:=bufio.NewWriter(wronly)fori:=0;i<5;i++{write.WriteString(str)}//Flush将缓存的文件真正写入到文件中3 _3 [5 F" i* N/ [

2 G# m( \/ w, {- g& s1 G6 @

write.Flush()//读取文件写入到控制台6 ^/ a! M Y, E* g# U) S. ` files,err:=gotool.FileUtils.OpenFileRdonly(path)iferr!=nil{t.Fatal(err)}defer

' D# J) `5 g* j4 e" A9 I

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

& l+ v* N8 V7 ~" W5 r4 P

(str)}}//out, _6 E" I w; B7 V ===RUNTestOpenFileWronlyhellowordgotoolhellowordgotoolhellowordgotoolhellowordgotoolhello

# u5 O( s2 b. _2 x! `9 R

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

, Y" M. d; c2 m0 d8 i2 b

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

) H2 ~0 h$ {" |

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

( J: g6 m$ H" N) E

(\n)iferr!=nil{break}fmt.Print(str)}}//out ) |$ h& b! T8 k: u8 x& `! \$ [* s ===RUNTestOpenFileRdonlyhellowordgotoolhellowordgotoolhello

, F- E) k4 R$ d) Q

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

' m! T$ V" j( ]& e

funcTestOpenFileAppend(t*testing.T){//打开文件在文件后面追加数据$ ?8 _" K f$ ^" \( n path:="F:/go-test/test/test.txt"str:="追加内容 \n"wronly

! {$ f5 i/ u: A

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

) y, ~ d4 @1 L D/ u& r3 D v \$ M

(wronly)fori:=0;i<5;i++{write.WriteString(str)}//Flush将缓存的文件真正写入到文件中 % ^6 _9 l3 C- [. j* ~; d write.Flush()//读取文件写入到控制台 ) M$ r( S+ k/ E0 \ files,

7 M4 Q, Q' B# f& a9 U F

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

) i& N& d& J: S1 g

(files)for{str,err:=reader.ReadString(\n)iferr!=nil{break}fmt.Print(str)}}//out 4 b ^' ?( O% _8 A/ ] ===RUNTestOpenFileAppend

- w1 L/ \) k4 Y

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

+ _8 ?4 k! y; Y: H

:TestOpenFileAppend(0.00s)PASS8、gotool.FileUtils.FileCopy 文件复制方法funcTestFileCopy(t*testing.T){//文件复制功能! Y; P! m5 T: V- O& P: u8 {- E6 C& V" K

4 m2 } k$ I, O6 Q

path:="F:/go-test/test/test.txt"copyPath:="F:/go-test/test/test.txt1"//复制钱 + @1 n9 n# ?3 k- q, ^3 y exists:=gotool.FileUtils.Exists

1 q* n5 I3 I8 s" ~) b* J

(copyPath)fmt.Println("复制前文件是否存在------------------>",exists)//复制后 % b, F8 o4 u9 k# ~$ m3 ~9 c3 n fileCopy,err:=gotool.FileUtils.FileCopy

- e6 O# [! a$ s( L

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

8 w k4 @5 t& _8 E2 m2 Y

("复制前文件是否存在------------------>",exists)}}//out, ]% B* J7 K- e6 ]3 | ===RUNTestFileCopy复制前文件是否存在------------------>false复制前文件是否存在

+ }; \+ w ~% v0 F5 d

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

" J- C/ m% ~" x$ ]6 | X1 N

funcTestCaptcha(t*testing.T){//生成验证码字符串,可以进行redis等存储用于验证逻辑 1 y( C1 S. M; J, z0 g str:=gotool.CaptchaUtils.GetRandStr(6)fmt.

& m* Q* M& h6 L8 a) o* S

Println(str)}//out 7 m' h: K Z- j ===RUNTestCaptcha生成验证码字符串------------------->qK5DME---PASS:TestCaptcha(0.01s)PASS2、gotool.CaptchaUtils.ImgText 生成图片[]byte数组,可以转成base64或者image文件

, T4 q% u+ g* l% j3 O& f+ E) U/ N

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

w, u Q) n+ N' i$ X' s8 r0 j

,str)//生成图片byte数据,可以根据需要转成base64或者是image图片文件( j& v* ?! }# v e% s. L text:=gotool.CaptchaUtils.ImgText(100,40,str)sourcestring

9 I9 J; v' S% _5 Z4 O) U

:=base64.StdEncoding.EncodeToString(text)fmt.Println(sourcestring)}//out ~' H' E9 P3 W5 j) Z ===RUNTestCaptcha生成验证码字符串-------------------

$ v$ Q4 P4 E+ _7 f; i9 D( m

>qK5DMEiVBORw0KGgoAAAANSUhEUgAAAGQAAAAoCAYAAAAIeF9DAAAbcUlEQVR4nOx6B3Rc1bX2PuXeO6MZjUaj3nu15SbLHWNjcIuN8SMYjAMYnPZCebz3QscQWmiPFFoCoRhCCAaDzcPGxrjLlnuTrGJJltW7ZkbSaGZuO

' j; A1 W/ @( T1 }

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

% i' T( |' R$ c3 ~( Q5 S

/BvnOgDi7u9Avf3ev9Mzbz0lev/c7K9Ht6kYP3PmYyfgU7thPv+t4/2zynQFJikli655b6zOur7v3BnPh8b3fWom6rqOiXQfJls92kJNHT2Gf1

2 i( B; U' M& O! C) H: s( u

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

+ N" U6 c5 T+ E2 d+ _

/JOLrO4NihEuLp8aDImAhud4SM6P2hRNEUpOgqyEwFv+pDsiaDrClI1VSQdRlk1Y9UXw9SmQYyoXzgeV0BWZORX5NB0RVQNRUZ/zt

. Q2 k$ X9 k. Q/ D

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

7 P2 H. t: t# U, a! s

/0vrKvCR0uNEUVQQ7BSO+E+QkwdKiHxukaomo/PXiiYj1VCyoWBVPqcIQ4kqUs8rjmmI88GYSowjE+dg5hyMb6GmDyDeDKAyqLGIoAv4OxsBRpibBRMXiQAilfq

5 V, x" b2 T% ]* a$ s2 ~: {

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, N+ h2 n/ b3 r$ ~

1 z) V' _- `& I

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

; _2 z( Q: q9 ~2 G0 c1 X

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

( ?9 R8 Q, C8 x, K. V3 P, _

)gotool.Logs.DebugLog().Println("Debug日志测试")}//out : K+ X' ^3 D8 b# ?2 x4 h: p ===RUNTestLogs[ERROR]2021/07/0715:58:10logs_test.go

6 F- `/ P: v m1 q1 g8 k$ \

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

" t; M3 O! q- n; g8 P# b: c

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

! Y9 D; N" D7 Z' q# i

.T){paginator:=gotool.PageUtils.Paginator(5,20,500)fmt.Println(paginator)}//out 5 G& N7 h# j% |& ~) P( e ===RUNTestPagemap[AfterPage

# J! S1 |8 }9 L# k2 D$ ~, J

:6beforePage:4currPage:5pages:[34567]totalPages:25]---PASS:TestPage(0.00s)PASS//说明 AfterPage 下一页 beforePage前一页 currPage当前页 pages页码 totalPages总页数 + P& C; w1 N8 o: x! ?

0 A* {3 `( Y# M) Q9 p! q! N

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

* f7 B2 Y* Q9 u- M5 @$ V1 R

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

% v! F/ B: l: q% a

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

5 I5 D5 I+ Y( B4 e& O; V: f$ _

,time)}}//out' V5 h0 P5 j# I' A( \ ===RUNTestUUID根据时间生成UUID去除--------------------->------>6fb94fe4dfd511ebbc4418c04d462680

& F( h- S m9 p5 r' F3 N

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

$ T* @! b! a8 o. `' ~" ?

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

1 ?* q7 w) M! p- r% |+ `/ K

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

; a" y2 ]" w0 H- L- b5 d- \

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

0 y0 V- I6 @ o$ s( h S

)}//out* `! {0 H* ~ s2 Y, v" p( ]& H" P ===RUNTestUUID根据随机数生成UUID去除--------------------->------>cf5bcdc585454cda95447aae186d14e6根据随机数生成不去除

6 Z% L( S+ Q3 y0 L! C

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

, h7 Q$ a4 p/ w' y1 B

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

' c& S$ w3 D! \! `

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

u- F: |0 ?+ w2 j2 `( k+ O

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

. \# d% b9 D3 C/ B( v9 r- a% I! G9 C

,captcha)}//out ; k6 ?1 w( R$ |2 t ===RUNTestCreateCaptcha18位------------------------------------------>492457482855750014

# T/ i& ~$ W+ C/ M& b

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

/ W3 Z8 w) [' O6 m5 T

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

5 w2 r3 a4 u) ~. Y

,work)}//out+ r, n5 ?* p+ c. Z ===RUNTestGetIdWork根据时间戳在加以计算获取int64类型id-------->1625746675366450---PASS:TestGetIdWork(0.00

4 H' }# t* M. f6 H

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

3 G7 X! ]9 T- }! r8 k: k

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

; p# k- N" H# \9 G

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

- k9 G9 P/ B t

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

; p+ s5 \) F; c+ G) _! K

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

5 _9 } V( B/ X, ?( G5 s0 D, d

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

: j) h; M7 \ O2 a7 D5 C- E

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

# ?' t2 _: ~5 R5 i, Q: B9 e* a3 C

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

& C) |* f4 `! ]$ `

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

8 Q, }$ k2 J/ B Y8 y# _5 H

(5)//default 30s : k. z" U- f/ i3 P( r. Y* ? 面向对象的操作模式req:=gotool.HttpUtils.NewRequest().Debug(true).SetHeaders(map[string]string

/ O* w2 H9 {! y( {6 Q4 S7 f, q9 a

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

) C8 E$ _5 C. J

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

4 F: `3 x- Y4 z. L- p$ Q0 _ C

)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 j; A( R" J) L1 z% n; `

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

0 Q: c2 W: g/ w5 L L, j* H4 P

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

% y& a' o$ A& i( M# b

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

: x7 K# p/ Z) O. z, g

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

0 @0 E# U; o, V- `3 I* @; b2 g. f2 T

return}returnstring(body)POST// Send nil4 z% X3 b1 i1 E3 t resp,err:=gotool.HttpUtils.Post("http://127.0.0.1:8000")// Send integer 2 ~% K' V: X! K; S, r

$ a7 k- D# x1 G5 E0 B9 X7 s6 t: L* R

resp,err:=gotool.HttpUtils.Post("http://127.0.0.1:8000",100)// Send []byte, [. T3 O+ S+ E0 X resp,err:=gotool.HttpUtils

1 ]4 K6 T% h0 p

.Post("http://127.0.0.1:8000",[]byte("bytes data"))// Send io.Reader % K% z* @3 L- | resp,err:=gotool.HttpUtils.Post(

( W# d v/ i% c5 Y

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

! k- J0 ] v' R

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

5 _) W$ t [4 g0 `& s

(buf[]byte))// Send string 3 K% ~- J& k; {* Y* K( `+ ^7 [) V resp,err:=gotool.HttpUtils.Post("http://127.0.0.1:8000","title=github&type=1"

" j. H3 g4 k, k9 L. a9 v" o

)// Send JSON & U' P8 S; a( b) g1 Y resp,err:=gotool.HttpUtils.JSON().Post("http://127.0.0.1:8000","{\"id\":10,\"title\":\"HttpRequest\"}"

) P2 {/ L) C$ N! Y- @

)// Send map[string]interface{}{} * C: V S0 e) g( ^& L( S0 n2 j& l resp,err:=req.Post("http://127.0.0.1:8000",map[string]interface{}{"id"

. M1 }3 Q2 b4 l

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

% _0 C' B5 a$ }( a+ a% O

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

: }; ?' l! @3 f; z2 m7 {

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

$ P7 U! ?5 J$ v$ }

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

, c! V) G( x8 @" w- ]

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

& Z3 W; n4 B5 {' I

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

+ ^0 U P z$ G, u+ K+ O2 K

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

9 V$ ~: C& R" G$ f5 F; C

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

6 _' y3 M4 |3 I, [) o

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

y) w* q2 f/ H9 D4 y

]-------------------------------------------------------------------Request:GEThttp://127.0.0.1:8000?name=iceview&age=19&score=100- S1 v; T5 Q+ G4 _

3 i' Y6 b' v. y+ I8 I, L4 P& ]

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

6 \8 x( j/ g4 D+ C% `

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

% P. H- g2 |! h4 o& `5 k

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

. S9 ^7 {1 d' V O+ p

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

: E( b0 i% R! P( _% A

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

/ A8 k0 {6 n: _2 }$ N y) N

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

! d: T) Q5 a7 F# V0 d' }: ~

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

% t9 ~- Y! }% e0 F5 u. ? 8 V. a: N' B9 B1 a1 F3 y% v8 A1 N8 K0 L( ~8 k 4 ^8 i6 x6 R9 u( n; X . D3 X4 A- p2 X( g7 t; \) @6 U. B' ~

暂时无法加载帖子列表

回复

使用道具 举报

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

使用道具 举报

风停花开 发表于 2026-10-19 19:19:17 | 显示全部楼层
这个思路很新颖,打开了新世界的大门,谢谢分享
回复

使用道具 举报

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

    本版积分规则

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

    GMT+8, 2026-10-31 09:30 , Processed in 0.065423 second(s), 25 queries , Gzip On.

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

    Powered by Discuz! X3.5

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