《gathertool开发使用文档》

《gathertool开发使用文档》

Date : 2023-03-28

Author : ManGe

Mail : 2912882908@qq.com

Github : https://github.com/mangenotwork/gathertool

文章目录

  • 《gathertool开发使用文档》
    • 一、介绍
      • 1.1 简介
      • 1.2 使用
      • 1.3 介绍
      • 1.4 使用场景
      • 1.5 简单例子
        • 简单的get请求
        • 含请求事件请求
        • 事件方法复用
        • post请求
        • 数据存储到mysql
        • HTML数据提取
        • Json数据提取
      • 1.6 实例
    • 二、请求
      • 2.1 请求事件
        • StartFunc(func (ctx \*Context))
        • SucceedFunc(func (ctx \*Context))
        • FailedFunc(func (ctx \*Context))
        • RetryFunc(func (ctx \*Context))
        • EndFunc(func (ctx \*Context))
        • func (c \*Context) SetSucceedFunc(successFunc func(c \*Context)) \*Context
        • func (c \*Context) SetFailedFunc(failedFunc func(c \*Context)) \*Context
        • func (c \*Context) SetRetryFunc(retryFunc func(c \*Context)) \*Context
        • 例子1:
        • 例子2:
      • 2.2 默认状态码事件
        • func SetStatusCodeSuccessEvent(code int)
        • func SetStatusCodeRetryEvent(code int)
        • func SetStatusCodeFailEvent(code int)
        • 默认状态码事件表:
        • 列子:
      • 2.3 事件转换
        • func (c \*Context) OpenErr2Retry()
      • 2.4 请求头
        • func GetAgent(agentType UserAgentType) string
        • func SetAgent(agentType UserAgentType, agent string)
      • 2.5 重试
        • func (c \*Context) GetRetryTimes() int
        • func (c \*Context) CloseRetry()
        • func (c \*Context) SetRetryTimes(times int) \*Context
      • 2.6 请求上下文 Context
        • func (c \*Context) SetSucceedFunc(successFunc func(c \*Context)) \*Context
        • func (c \*Context) SetFailedFunc(failedFunc func(c \*Context)) \*Context
        • func (c \*Context) SetRetryFunc(retryFunc func(c \*Context)) \*Context
        • func (c \*Context) SetRetryTimes(times int) \*Context
        • func (c \*Context) GetRetryTimes() int
        • func (c \*Context) Do() func()
        • func (c \*Context) RespBodyString() string
        • func (c \*Context) RespBodyHtml() string
        • func (c \*Context) RespBodyMap() map[string]interface{}
        • func (c \*Context) RespBodyArr() []interface{}
        • func (c \*Context) GetRespHeader() string
        • func (c \*Context) RespContentLength() int64
        • func (c \*Context) CheckReqMd5() string
        • func (c \*Context) CheckMd5() string
        • func (c \*Context) AddHeader(k,v string) *Context
        • func (c \*Context) AddCookie(k, v string) *Context
        • func (c \*Context) SetProxy(proxyUrl string) *Context
        • func (c \*Context) SetProxyFunc(f func() *http.Transport) *Context
        • func (c \*Context) SetProxyPool(pool *ProxyPool) *Context
        • func (c \*Context) Upload(filePath string) func()
        • func (c \*Context) CookieNext() error
        • func (c \*Context) CloseLog()
        • func (c \*Context) OpenErr2Retry()
        • func (c \*Context) CloseRetry()
        • func (c \*Context) GetParam(key string) interface{}
        • func (c \*Context) AddParam(key string, val interface{})
        • func (c \*Context) DelParam(key string)
        • func (c \*Context) Upload(filePath string) func()
      • 2.7 Context 的成员
    • 三、请求使用
      • 3.1 Get
        • func Get(url string) (\*Context, error)
        • func NewGet(url string) \*Context
      • 3.2 Post
        • func Post(url string, data []byte, contentType string) (\*Context, error)
        • func NewPost(url string, data []byte, contentType string) \*Context
        • func PostJson(url string, jsonStr string) (\*Context, error)
        • func PostForm(url string, data url.Values) (\*Context, error)
        • func NewPostForm(u string, data map[string]string, vs …interface{}) \*Context
        • func PostFile(url, paramName, filePath string, vs …interface{}) \*Context
      • 3.3 Put
        • func Put(url string, data []byte, contentType string, vs …interface{}) (\*Context, error)
        • func NewPut(url string, data []byte, contentType string, vs …interface{}) \*Context
      • 3.4 Delete
        • func Delete(url string, vs …interface{}) (\*Context, error)
        • func NewDelete(url string, vs …interface{}) \*Context
      • 3.5 Options
        • func Options(url string, vs …interface{}) (\*Context, error)
        • func NewOptions(url string, vs …interface{}) \*Context
      • 3.6 Upload
        • func Upload(url, savePath string, vs …interface{}) (\*Context, error)
      • 3.7 代理
        • func NewProxyIP(ip string, port int, user, pass string, isTls bool) \*ProxyIP
        • func (p \*ProxyIP) String() string
        • type ProxyPool struct
        • func NewProxyPool() \*ProxyPool
        • func (p \*ProxyPool) Add(proxyIP \*ProxyIP)
        • func (p \*ProxyPool) Get() (string, int)
        • func (p \*ProxyPool) Del(n int)
      • 3.8 Cookie
        • var CookiePool \*cookiePool
        • func NewCookiePool() \*cookiePool
        • func (c \*cookiePool) Add(cookie \*http.Cookie)
        • func (c \*cookiePool) Get() \*http.Cookie
        • func (p *ProxyPool) Del(n int)
        • func (c *Context) CookieNext() error
      • 3.9 Header
        • type Header map[string]string
        • func NewHeader(data map[string]string) Header
        • func (h Header) Set(key, value string) Header
        • func (h Header) Delete(key string) Header
        • func (c *Context) AddHeader(k,v string) *Context
        • func (c *Context) GetRespHeader() string
      • 3.10 Body
        • func (c *Context) RespBodyString() string
        • func (c *Context) RespBodyHtml() string
        • func (c *Context) RespBodyMap() map[string]interface{}
        • func (c *Context) RespBodyArr() []interface{}
        • func (c *Context) RespContentLength() int64
        • func (c *Context) CheckReqMd5() string
        • func (c *Context) CheckMd5() string
      • 3.11 日志
        • func (c *Context) CloseLog()
        • func CloseLog()
        • func SetLogFile(name string)
        • func (l *logger) Log(level Level, args string, times int)
        • func Info(args …interface{})
        • func Infof(format string, args …interface{})
        • func InfoTimes(times int, args …interface{})
        • func InfofTimes(format string, times int, args …interface{})
        • func Debug(args …interface{})
        • func Debugf(format string, args …interface{})
        • func DebugTimes(times int, args …interface{})
        • func DebugfTimes(format string, times int, args …interface{})
        • func Warn(args …interface{})
        • func Warnf(format string, args …interface{})
        • func WarnTimes(times int, args …interface{})
        • func WarnfTimes(format string, times int, args …interface{})
        • func Error(args …interface{})
        • func Errorf(format string, args …interface{})
        • func ErrorTimes(times int, args …interface{})
        • func ErrorfTimes(format string, times int, args …interface{})
      • 3.12 参数
        • func (c *Context) GetParam(key string) interface{}
        • func (c *Context) AddParam(key string, val interface{})
        • func (c *Context) DelParam(key string)
      • 3.13 进度条
        • type Bar struct
        • func (bar *Bar) NewOption(start, total int64)
        • func (bar *Bar) NewOptionWithGraph(start, total int64, graph string)
        • func (bar *Bar) Play(cur int64)
        • func (bar *Bar) Finish()
        • 实例
      • 3.14 其他
        • func (c *Context) OpenErr2Retry()
        • func (c *Context) CloseRetry()
        • func SearchPort(ipStr string, vs …interface{})
        • func Ping(ip string)
    • 四、常用方法
      • 4.1 类型转换
        • func Any2String(data interface{}) string
        • func Json2Map(str string) map[string]interface{}
        • func Map2Json(m map[string]interface{}) (string, error)
        • func Any2Map(data interface{}) map[string]interface{}
        • func Any2Int(data interface{}) int
        • func Any2int64(data interface{}) int64
        • func Any2Arr(data interface{}) []interface{}
        • func Any2Float64(data interface{}) float64
        • func Any2Strings(data interface{}) []string
        • func Any2Json(data interface{}) (string, error)
        • func Int2Hex(i int64) string
        • func Int642Hex(i int64) string
        • func Hex2Int(s string) int
        • func Hex2Int64(s string) int64
        • func Str2Int64(str string) int64
        • func Str2Int(str string) int
        • func Str2Int32(str string) int32
        • func Str2Float64(str string) float64
        • func Str2Float32(str string) float32
        • func Uint82Str(bs []uint8) string
        • func Str2Byte(s string) []byte
        • func Byte2Str(b []byte) string
        • func Bool2Byte(b bool) []byte
        • func Byte2Bool(b []byte) bool
        • func Int2Byte(i int) []byte
        • func Byte2Int(b []byte) int
        • func Int642Byte(i int64) []byte
        • func Byte2Int64(b []byte) int64
        • func Float322Byte(f float32) []byte
        • func Float322Uint32(f float32) uint32
        • func Byte2Float32(b []byte) float32
        • func Float642Byte(f float64) []byte
        • func Float642Uint64(f float64) uint64
        • func Byte2Float64(b []byte) float64
        • func Byte2Bit(b []byte) []uint8
        • func Bit2Byte(b []uint8) []byte
        • func Struct2Map(obj interface{}, hasValue bool) (map[string]interface{}, error)
      • 4.2 字符串相关
        • func MD5(str string) string
        • func CleaningStr(str string) string
        • func StrDeleteSpace(str string) string
        • func IsContainStr(items []string, item string) bool
      • 4.3 其他
        • func OSLine() string
        • func EncodeByte(v interface{}) []byte
        • func DecodeByte(b []byte) (interface{}, error)
        • func FileSizeFormat(fileSize int64) (size string)
        • func DeepCopy(dst, src interface{}) error
        • func FileMd5(path string) (string, error)
        • func PathExists(path string)
        • func StrDuplicates(a []string) []string
        • func windowsPath(path string) string
        • func GetNowPath() string
        • func FileMd5sum(fileName string) string
        • func SearchBytesIndex(bSrc []byte, b byte) int
        • func IF(condition bool, a, b interface{}) interface{}
        • func CopySlice(s []interface{}) []interface{}
        • func CopySliceStr(s []string) []string
        • func CopySliceInt(s []int) []int
        • func CopySliceInt64(s []int64) []int64
        • func IsInSlice(s []interface{}, v interface{}) bool
        • func ReplaceAllToOne(str string, from []string, to string) string
        • func Exists(path string) bool
        • func IsDir(path string) bool
        • func Pwd() string
        • func Chdir(dir string) error
        • func HumanFriendlyTraffic(bytes uint64) string
        • func StrToSize(sizeStr string) int64
      • 4.4 字符转码,编码解码
        • func ConvertByte2String(byte []byte, charset Charset) string
        • func UnicodeDec(raw string) string
        • func UnicodeDecByte(raw []byte) []byte
        • func UnescapeUnicode(raw []byte) ([]byte, error)
        • func Base64Encode(str string) string
        • func Base64Decode(str string) (string,error)
        • func Base64UrlEncode(str string) string
        • func Base64UrlDecode(str string) (string,error)
        • func ToUTF8(srcCharset string, src string) (dst string, err error)
        • func UTF8To(dstCharset string, src string) (dst string, err error)
        • func ToUTF16(srcCharset string, src string) (dst string, err error)
        • func UTF16To(dstCharset string, src string) (dst string, err error)
        • func ToBIG5(srcCharset string, src string) (dst string, err error)
        • func BIG5To(dstCharset string, src string) (dst string, err error)
        • func ToGDK(srcCharset string, src string) (dst string, err error)
        • func GDKTo(dstCharset string, src string) (dst string, err error)
        • func ToGB18030(srcCharset string, src string) (dst string, err error)
        • func GB18030To(dstCharset string, src string) (dst string, err error)
        • func ToGB2312(srcCharset string, src string) (dst string, err error)
        • func GB2312To(dstCharset string, src string) (dst string, err error)
        • func ToHZGB2312(srcCharset string, src string) (dst string, err error)
        • func HZGB2312To(dstCharset string, src string) (dst string, err error)
      • 4.5 集合
        • type Set map[string]struct{}
        • func (s Set) Has(key string) bool
        • func (s Set) Add(key string)
        • func (s Set) Delete(key string)
      • 4.6 栈
        • type Stack struct
        • func New() *Stack
        • func (s *Stack) Push(data interface{})
        • func (s *Stack) Pop()
        • func (s *Stack) String() string
      • 4.7 Map
        • func MapCopy(data map[string]interface{}) (copy map[string]interface{})
        • func MapMergeCopy(src …map[string]interface{}) (copy map[string]interface{})
        • func Map2Slice(data interface{}) []interface{}
      • 4.8 固定顺序Map
        • func NewGDMap() *gDMap
        • func (m *gDMap) Add(key string, value interface{}) *gDMap
        • func (m *gDMap) Get(key string) interface{}
        • func (m *gDMap) Del(key string) *gDMap
        • func (m *gDMap) Len() int
        • func (m *gDMap) KeyList() []string
        • func (m *gDMap) AddMap(data map[string]interface{}) *gDMap
        • func (m *gDMap) Range(f func(k string, v interface{})) *gDMap
        • func (m *gDMap) RangeAt(f func(id int, k string, v interface{})) *gDMap
        • func (m *gDMap) CheckValue(value interface{}) bool
        • func (m *gDMap) Reverse()
      • 4.9 Slice
        • func SliceCopy(data []interface{}) []interface{}
        • func Slice2Map(slice interface{}) map[string]interface{}
        • func SliceTool() *sliceTool
        • func (sliceTool) CopyInt64(a []int64) []int64
        • func (sliceTool) CopyStr(a []string) []string
        • func (sliceTool) CopyInt(a []int) []int
        • func (sliceTool) ContainsByte(a []byte, x byte) bool
        • func (sliceTool) ContainsInt(a []int, x int) bool
        • func (sliceTool) ContainsInt64(a []int64, x int64) bool
        • func (sliceTool) ContainsStr(a []string, x string) bool
        • func (sliceTool) DeduplicateInt(a []int) []int
        • func (sliceTool) DeduplicateInt64(a []int64) []int64
        • func (sliceTool) DeduplicateStr(a []string) []string
        • func (sliceTool) DelInt(a []int, i int) []int
        • func (sliceTool) DelInt64(a []int64, i int) []int64
        • func (sliceTool) DelStr(a []string, i int) []string
        • func (sliceTool) MaxInt(a []int) int
        • func (sliceTool) MaxInt64(a []int64) int64
        • func (sliceTool) MinInt(a []int) int
        • func (sliceTool) MinInt64(a []int64) int64
        • func (sliceTool) PopInt(a []int) (int, []int)
        • func (sliceTool) PopInt64(a []int64) (int64, []int64)
        • func (sliceTool) PopStr(a []string) (string, []string)
        • func (sliceTool) ReverseInt(a []int) []int
        • func (sliceTool) ReverseInt64(a []int64) []int64
        • func (sliceTool) ReverseStr(a []string) []string
        • func (sliceTool) ShuffleInt(a []int) []int
      • 4.10 时间相关方法
        • func Timestamp() string
        • func BeginDayUnix() int64
        • func EndDayUnix() int64
        • func MinuteAgo(i int) int64
        • func HourAgo(i int) int64
        • func DayAgo(i int) int64
        • func Daydiff(beginDay string, endDay string) int
        • func TickerRun(t time.Duration, runFirst bool, f func())
        • func Timestamp2Date(timestamp int64) string
        • func GetChineseMonthDay(date string) (rMonth, rDay int64)
        • func NowToEnd() (int64, error)
        • func IsLeap(year int) bool
        • func IsToday(timestamp int64) string
        • func IsTodayList(timestamp int64) string
        • func Timestamp2Week(timestamp int64) string
        • func Timestamp2WeekXinQi(timestamp int64) string
    • 五、数据提取
      • 5.1 正则
        • func RegFindAll(regStr, rest string) [][]string
        • func RegHtmlA(str string, property …string) []string
        • func RegHtmlTitle(str string, property …string) []string
        • func RegHtmlTr(str string, property …string) []string
        • func RegHtmlInput(str string, property …string) []string
        • func RegHtmlTd(str string, property …string) []string
        • func RegHtmlP(str string, property …string) []string
        • func RegHtmlSpan(str string, property …string) []string
        • func RegHtmlSrc(str string, property …string) []string
        • func RegHtmlHref(str string, property …string) []string
        • func RegHtmlVideo(str string, property …string) []string
        • func RegHtmlCanvas(str string, property …string) []string
        • func RegHtmlCode(str string, property …string) []string
        • func RegHtmlImg(str string, property …string) []string
        • func RegHtmlUl(str string, property …string) []string
        • func RegHtmlLi(str string, property …string) []string
        • func RegHtmlMeta(str string, property …string) []string
        • func RegHtmlSelect(str string, property …string) []string
        • func RegHtmlTable(str string, property …string) []string
        • func RegHtmlButton(str string, property …string) []string
        • func RegHtmlH(str, typeH string, property …string) []string
        • func RegHtmlTbody(str string, property …string) []string
        • func RegHtmlATxt(str string, property …string) []string
        • func RegHtmlTitleTxt(str string, property …string) []string
        • func RegHtmlTrTxt(str string, property …string) []string
        • func RegHtmlInputTxt(str string, property …string) []string
        • func RegHtmlTdTxt(str string, property …string) []string
        • func RegHtmlPTxt(str string, property …string) []string
        • func RegHtmlSpanTxt(str string, property …string) []string
        • func RegHtmlSrcTxt(str string, property …string) []string
        • func RegHtmlHrefTxt(str string, property …string) []string
        • func RegHtmlCodeTxt(str string, property …string) []string
        • func RegHtmlUlTxt(str string, property …string) []string
        • func RegHtmlLiTxt(str string, property …string) []string
        • func RegHtmlSelectTxt(str string, property …string) []string
        • func RegHtmlTableTxt(str string, property …string) []string
        • func RegHtmlButtonTxt(str string, property …string) []string
        • func RegHtmlHTxt(str, typeH string, property …string) []string
        • func RegDelHtml(str string) string
        • func RegDelNumber(str string) string
        • func RegDelHtmlA(str string) string
        • func RegDelHtmlTitle(str string) string
        • func RegDelHtmlTr(str string) string
        • func RegDelHtmlInput(str string, property …string) string
        • func RegDelHtmlTd(str string, property …string) string
        • func RegDelHtmlP(str string, property …string) string
        • func RegDelHtmlSpan(str string, property …string) string
        • func RegDelHtmlSrc(str string, property …string) string
        • func RegDelHtmlHref(str string, property …string) string
        • func RegDelHtmlVideo(str string, property …string) string
        • func RegDelHtmlCanvas(str string, property …string) string
        • func RegDelHtmlCode(str string, property …string) string
        • func RegDelHtmlImg(str string, property …string) string
        • func RegDelHtmlUl(str string, property …string) string
        • func RegDelHtmlLi(str string, property …string) string
        • func RegDelHtmlMeta(str string, property …string) string
        • func RegDelHtmlSelect(str string, property …string) string
        • func RegDelHtmlTable(str string, property …string) string
        • func RegDelHtmlButton(str string, property …string) string
        • func RegDelHtmlH(str, typeH string, property …string) string
        • func RegDelHtmlTbody(str string, property …string) string
        • func IsNumber(str string) bool
        • func IsNumber2Len(str string, l int) bool
        • func IsNumber2Heard(str string, n int) bool
        • func IsFloat(str string) bool
        • func IsFloat2Len(str string, l int) bool
        • func IsChineseAll(str string) bool
        • func IsChinese(str string) bool
        • func IsChineseN(str string, number int) bool
        • func IsChineseNumber(str string) bool
        • func IsChineseMoney(str string) bool
        • func IsEngAll(str string) bool
        • func IsEngLen(str string, l int) bool
        • func IsEngNumber(str string) bool
        • func IsAllCapital(str string) bool
        • func IsHaveCapital(str string) bool
        • func IsAllLower(str string) bool
        • func IsHaveLower(str string) bool
        • func IsLeastNumber(str string, n int) bool
        • func IsLeastCapital(str string, n int) bool
        • func IsLeastLower(str string, n int) bool
        • func IsLeastSpecial(str string, n int) bool
        • func IsDomain(str string) bool
        • func IsURL(str string) bool
        • func IsPhone(str string) bool
        • func IsLandline(str string) bool
        • func IsIP(str string) bool
        • func AccountRational(str string) bool
        • func IsXMLFile(str string) bool
        • func IsUUID3(str string) bool
        • func IsUUID4(str string) bool
        • func IsUUID5(str string) bool
        • func IsRGB(str string) bool
        • func IsFullWidth(str string) bool
        • func IsHalfWidth(str string) bool
        • func IsBase64(str string) bool
        • func IsLatitude(str string) bool
        • func IsLongitude(str string) bool
        • func IsDNSName(str string) bool
        • func IsIPv4(str string) bool
        • func IsWindowsPath(str string) bool
        • func IsUnixPath(str string) bool
        • func RegTime(str string, property …string) []string
        • func RegLink(str string, property …string) []string
        • func RegEmail(str string, property …string) []string
        • func RegIPv4(str string, property …string) []string
        • func RegIPv6(str string, property …string) []string
        • func RegIP(str string, property …string) []string
        • func RegMD5Hex(str string, property …string) []string
        • func RegSHA1Hex(str string, property …string) []string
        • func RegSHA256Hex(str string, property …string) []string
        • func RegGUID(str string, property …string) []string
        • func RegMACAddress(str string, property …string) []string
        • func RegEmail2(str string, property …string) []string
        • func RegUUID3(str string, property …string) []string
        • func RegUUID4(str string, property …string) []string
        • func RegUUID5(str string, property …string) []string
        • func RegUUID(str string, property …string) []string
        • func RegInt(str string, property …string) []string
        • func RegFloat(str string, property …string) []string
        • func RegRGBColor(str string, property …string) []string
        • func RegFullWidth(str string, property …string) []string
        • func RegHalfWidth(str string, property …string) []string
        • func RegBase64(str string, property …string) []string
        • func RegLatitude(str string, property …string) []string
        • func RegLongitude(str string, property …string) []string
        • func RegDNSName(str string, property …string) []string
        • func RegFullURL(str string, property …string) []string
        • func RegURLSchema(str string, property …string) []string
        • func RegURLUsername(str string, property …string) []string
        • func RegURLPath(str string, property …string) []string
        • func RegURLPort(str string, property …string) []string
        • func RegURLIP(str string, property …string) []string
        • func RegURLSubdomain(str string, property …string) []string
        • func RegWinPath(str string, property …string) []string
        • func RegUnixPath(str string, property …string) []string
      • 5.2 Html提取
        • func GetPointHTML(htmlStr, label, attr, val string) ([]string, error)
        • func GetPointIDHTML(htmlStr, label, val string) ([]string, error)
        • func GetPointClassHTML(htmlStr, label, val string) ([]string, error)
      • 5.3 Json提取
        • func JsonFind(jsonStr, find string) (interface{}, error)
        • func JsonFind2Json(jsonStr, find string) (string, error)
        • func JsonFind2Map(jsonStr, find string) (map[string]interface{}, error)
        • func JsonFind2Arr(jsonStr, find string) ([]interface{}, error)
        • func IsJson(str string) bool
    • 六、爬虫篇
      • 6.1 例子
      • 6.2 并发抓取
        • func NewQueue() TodoQueue
        • func (q \*Queue) Add(task \*Task) error
        • func (q \*Queue) Poll() \*Task
        • func (q \*Queue) Clear() bool
        • func (q \*Queue) Size() int
        • func (q \*Queue) IsEmpty() bool
        • func (q *Queue) Print()
        • type UploadQueue struct
        • func NewUploadQueue() TodoQueue
        • func (q *UploadQueue) Add(task *Task) error
        • func (q *UploadQueue) Poll() *Task
        • 任务对象
        • func (task Task) GetDataStr(key string) string
        • func (task Task) AddData(key string, value interface{}) Task
        • func CrawlerTask(url, jsonParam string, vs …interface{}) *Task
        • func StartJob(jobNumber int, queue TodoQueue,f func(task *Task))
        • func StartJobGet(jobNumber int, queue TodoQueue, vs …interface{})
        • func StartJobPost(jobNumber int, queue TodoQueue, vs …interface{})
        • func CPUMax()
      • 6.3 并发抓取列子
      • 6.4 更多实例子 [见](https://github.com/mangenotwork/gathertool/tree/main/_examples/)
    • 七、Mysql存储篇
      • 7.1 方法
        • var MysqlDB
        • type Mysql struct
        • func NewMysqlDB(host string, port int, user, password, database string) (err error)
        • func NewMysql(host string, port int, user, password, database string) (\*Mysql, error)
        • func GetMysqlDBConn() (\*Mysql,error)
        • func (m \*Mysql) CloseLog()
        • func (m \*Mysql) SetMaxOpenConn(number int)
        • func (m \*Mysql) SetMaxIdleConn(number int)
        • func (m \*Mysql) Conn() (err error)
        • func (m \*Mysql) IsHaveTable(table string) bool
        • type TableInfo struct
        • func (m \*Mysql) Describe(table string) ( \*tableDescribe, error)
        • func (m \*Mysql) Select(sql string) ([]map[string]string, error)
        • func (m \*Mysql) NewTable(table string, fields map[string]string) error
        • func (m \*Mysql) NewTableGd(table string, fields \*gDMap) error
        • func (m \*Mysql) Insert(table string, fieldData map[string]interface{}) error
        • func (m \*Mysql) InsertAt(table string, fieldData map[string]interface{}) error
        • func (m \*Mysql) InsertAtGd(table string, fieldData \*gDMap) error
        • func (m \*Mysql) InsertAtJson(table, jsonStr string) error
        • func (m \*Mysql) Update(sql string) error
        • func (m \*Mysql) Exec(sql string) error
        • func (m \*Mysql) Query(sql string) ([]map[string]string, error)
        • func (m \*Mysql) Delete(sql string) error
        • func (m \*Mysql) ToVarChar(data interface{}) string
        • func (m \*Mysql) DeleteTable(tableName string) error
        • func (m \*Mysql) HasTable(tableName string) bool
        • func (m \*Mysql) ToXls(sql, outPath string)
      • 7.2 实例
    • 八、接口测试篇
        • type StressUrl struct
        • func NewTestUrl(url, method string, sum int64, total int) \*StressUrl
        • func (s \*StressUrl) SetJson(str string)
        • func (s \*StressUrl) Run(vs …interface{})
        • 例子:
    • 九、加密解密篇
        • type AES interface
        • type DES interface
        • func NewAES(typeName string, arg …[]byte) AES
        • func NewDES(typeName string, arg …[]byte) DES
        • func (cbc *cbcObj) Encrypt(str, key []byte) ([]byte, error)
        • func (cbc *cbcObj) Decrypt(str, key []byte) ([]byte, error)
        • func (ecb *ecbObj) Encrypt(str, key []byte) ([]byte, error)
        • func (ecb *ecbObj) Decrypt(str, key []byte) ([]byte, error)
        • func (cfb *cfbObj) Encrypt(str, key []byte) ([]byte, error)
        • func (cfb *cfbObj) Decrypt(str, key []byte) ([]byte, error)
        • func (ctr *ctrObj) Encrypt(str, key []byte) ([]byte, error)
        • func (ctr *ctrObj) Decrypt(str, key []byte) ([]byte, error)
        • func HmacMD5(str, key string) string
        • func HmacSHA1(str, key string) string
        • func HmacSHA256(str, key string) string
        • func HmacSHA512(str, key string) string
        • func PBKDF2(str, salt []byte, iterations, keySize int) ([]byte)
        • func JwtEncrypt(data map[string]interface{}, secret, method string) (string, error)
        • func JwtEncrypt256(data map[string]interface{}, secret string) (string, error)
        • func JwtEncrypt384(data map[string]interface{}, secret string) (string, error)
        • func JwtEncrypt512(data map[string]interface{}, secret string) (string, error)
        • func JwtDecrypt(tokenString, secret string) (data map[string]interface{}, err error)
    • 十、Redis篇
      • 10.1 连接
        • type Rds struct
        • func (r \*Rds) RedisConn() (err error)
        • func (r \*Rds) RedisPool() error
        • func (r \*Rds) GetConn() redis.Conn
        • func (r \*Rds) SelectDB(dbNumber int) error
        • func NewSSHInfo( addr, user, password string) \*SSHConnInfo
        • func NewRedis(host, port, password string, db int, vs …interface{}) (\*Rds)
        • func NewRedisPool(host, port, password string, db, maxIdle, maxActive, idleTimeoutSec int, vs …interface{}) (\*Rds)
        • func RedisDELKeys(rds \*Rds, keys string, jobNumber int)
        • func (r *Rds) MqProducer(mqName string, data interface{}) error
        • func (r *Rds) MqConsumer(mqName string) (reply interface{}, err error)
        • func (r *Rds) MqLen(mqName string) int64
        • func (r *Rds) ToString(reply interface{}, err error) (string, error)
        • func (r *Rds) ToInt(reply interface{}, err error) (int, error)
        • func (r *Rds) ToInt64(reply interface{}, err error) (int64, error)
        • func (r *Rds) ToBool(reply interface{}, err error) (bool, error)
        • func (r *Rds) ToBytes(reply interface{}, err error) ([]byte, error)
        • func (r *Rds) ToByteSlices(reply interface{}, err error) ([][]byte, error)
        • func (r *Rds) ToFloat64(reply interface{}, err error) (float64, error)
        • func (r *Rds) ToFloat64s(reply interface{}, err error) ([]float64, error)
        • func (r *Rds) ToInt64Map(reply interface{}, err error) (map[string]int64, error)
        • func (r *Rds) ToInt64s(reply interface{}, err error) ([]int64, error)
        • func (r *Rds) ToIntMap(reply interface{}, err error) (map[string]int, error)
        • func (r *Rds) ToInts(reply interface{}, err error) ([]int, error)
        • func (r *Rds) ToStringMap(reply interface{}, err error) (map[string]string, error)
        • func (r *Rds) ToStrings(reply interface{}, err error) ([]string, error)
      • 10.2 keys
        • func (c *RedisClient) GetALLKeys(match string) (ksyList map[string]int)
        • func (r *Rds) SearchKeys(match string) (ksyList map[string]int)
        • func (r *Rds) Type(key string) string
        • func (r *Rds) Ttl(key string) int64
        • func (r *Rds) DUMP(key string) bool
        • func (r *Rds) Rename(name, newName string) bool
        • func (r *Rds) Expire(key string, ttl int64) bool
        • func (r *Rds) ExpireAt(key string, date int64) bool
        • func (r *Rds) DelKey(key string) bool
      • 10.3 string
        • func (r *Rds) Get(key string) (string, error)
        • func (r *Rds) Set(key string, value interface{}) error
        • func (r *Rds) SetEx(key string, ttl int64, value interface{}) error
        • func (r *Rds) PSetEx(key string, ttl int64, value interface{}) error
        • func (r *Rds) SetNx(key string, value interface{}) error
        • func (r *Rds) SetRange(key string, offset int64, value interface{}) error
        • func (r *Rds) Append(key string, value interface{}) error
        • func (r *Rds) Decr(key string) (int64, error)
        • func (r *Rds) DecrBy(key, decrement string) (int64, error)
        • func (r *Rds) GetRange(key string, start, end int64) (string, error)
        • func (r *Rds) GetSet(key string, value interface{}) (string, error)
        • func (r *Rds) Incr(key string) (int64, error)
        • func (r *Rds) IncrBy(key, increment string) (int64, error)
        • func (r *Rds) IncrByFloat(key, increment float64) (float64, error)
        • func (r *Rds) MGet(key []interface{}) ([]string, error
        • func (r *Rds) MSet(values []interface{}) error
        • func (r *Rds) MSetNx(values []interface{}) error
      • 10.4 list
        • func (r *Rds) LRange(key string) ([]interface{}, error)
        • func (r *Rds) LRangeST(key string, start, stop int64) ([]interface{}, error)
        • func (r *Rds) LPush(key string, values []interface{}) error
        • func (r *Rds) RPush(key string, values []interface{}) error
        • func (r *Rds) LIndex(key string, index int64) (string, error)
        • func (r *Rds) LInsert(direction bool, key, pivot, value string) error
        • func (r *Rds) LLen(key string) (int64, error)
        • func (r *Rds) ListLPOP(key string) (string, error)
        • func (r *Rds) LPusHx(key string, value interface{}) error
        • func (r *Rds) LRem(key string, count int64, value interface{}) error
        • func (r *Rds) LSet(key string, index int64, value interface{}) error
        • func (r *Rds) LTrim(key string, start, stop int64) error
        • func (r *Rds) RPop(key string) (string, error)
        • func (r *Rds) RPopLPush(key, destination string) (string, error)
        • func (r *Rds) RPushX(key string, value interface{}) error
      • 10.5 hash
        • func (r *Rds) HGetAll(key string) (map[string]string, error)
        • func (r *Rds) HGetAllInt(key string) (map[string]int, error)
        • func (r *Rds) HGetAllInt64(key string) (map[string]int64, error)
        • func (r *Rds) HSet(key, field string, value interface{}) (int64, error)
        • func (r *Rds) HMSet(key string, values map[interface{}]interface{}) error
        • func (r *Rds) HSetNx(key, field string, value interface{}) error
        • func (r *Rds) HDel(key string, fields []string) error
        • func (r *Rds) HExIsTs(key, fields string) bool
        • func (r *Rds) HGet(key, fields string) (string, error)
        • func (r *Rds) HIncrBy(key, field string, increment int64) (int64, error)
        • func (r *Rds) HIncrByFloat(key, field string, increment float64) (float64, error)
        • func (r *Rds) HKeys(key string) ([]string, error)
        • func (r *Rds) HLen(key string) (int64, error)
        • func (r *Rds) HMGet(key string, fields []string) ([]string, error)
        • func (r *Rds) HVaLs(key string) ([]string, error)
      • 10.6 set
        • func (r *Rds) SMemeRs(key string) ([]interface{}, error)
        • func (r *Rds) SAdd(key string, values []interface{}) error
        • func (r *Rds) SCard(key string) error
        • func (r *Rds) SDiff(keys []string) ([]interface{}, error)
        • func (r *Rds) SDiffStore(key string, keys []string) ([]interface{}, error)
        • func (r *Rds) SInter(keys []string) ([]interface{}, error)
        • func (r *Rds) SInterStore(key string, keys []string) ([]interface{}, error)
        • func (r *Rds) SIsMember(key string, value interface{}) (resBool bool, err error)
        • func (r *Rds) SMove(key, destination string, member interface{}) (resBool bool, err error)
        • func (r *Rds) SPop(key string) (string, error)
        • func (r *Rds) SRandMember(key string, count int64) ([]interface{}, error)
        • func (r *Rds) SRem(key string, member []interface{}) error
        • func (r *Rds) SUnion(keys []string) ([]interface{}, error)
        • func (r *Rds) SUnionStore(key string, keys []string) ([]interface{}, error)
      • 10.7 zset
        • func (r *Rds) ZRange(key string) ([]interface{}, error)
        • func (r *Rds) ZRangeST(key string, start, stop int64) ([]interface{}, error)
        • func (r *Rds) ZRevRange(key string, start, stop int64) ([]interface{}, error)
        • func (r *Rds) ZAdd(key string, values []interface{}) error
        • func (r *Rds) ZCard(key string) (int64, error)
        • func (r *Rds) ZCount(key string, min, max int64) (int64, error)
        • func (r *Rds) ZIncrBy(key, member string, increment int64) (string, error)
        • func (r *Rds) ZRangeByScore(key string, min, max, offset, count int64) ([]interface{}, error)
        • func (r *Rds) ZRangeByScoreAll(key string) ([]interface{}, error)
        • func (r *Rds) ZRevRangeByScore(key string, min, max, offset, count int64) ([]interface{}, error)
        • func (r *Rds) ZRevRangeByScoreAll(key string) ([]interface{}, error)
        • func (r *Rds) ZRank(key string, member interface{}) (int64, error)
        • func (r *Rds) ZRem(key string, member []interface{}) error
        • func (r *Rds) ZRemRangeByRank(key string, start, stop int64) error
        • func (r *Rds) ZRemRangeByScore(key string, min, max int64) error
        • func (r *Rds) ZRevRank(key string, member interface{}) (int64, error)
        • func (r *Rds) ZScore(key string, member interface{}) (string, error)
    • 十一、消息队列
      • 11.1 接口
      • 11.2 nsq
        • func NewNsq(server string, port …int) MQer
        • func (m *MQNsqService) Producer(topic string, data []byte)
        • func (m *MQNsqService) Consumer(topic string) []byte
        • 实例
      • 11.3 RabbitMq
        • func NewRabbit(amqpUrl string) MQer
        • func (m *MQNsqService) Producer(topic string, data []byte)
        • func (m *MQNsqService) Consumer(topic string) []byte
        • 实例
      • 11.4 KafKa
        • func NewKafka(server []string) MQer
        • func (m *MQNsqService) Producer(topic string, data []byte)
        • func (m *MQNsqService) Consumer(topic string) []byte
        • 实例
      • 11.5 redis
        • func (r *Rds) MqProducer(mqName string, data interface{}) error
        • func (r *Rds) MqConsumer(mqName string) (reply interface{}, err error)
        • func (r *Rds) MqLen(mqName string) int64
    • 十二、Mongo篇
        • type Mongo struct
        • func NewMongo(user, password, host, port string) (*Mongo, error)
        • func (m *Mongo) GetConn() (err error)
        • func (m *Mongo) GetDB(dbname string)
        • func (m *Mongo) GetCollection(dbname, name string)
        • func (m *Mongo) Insert(document interface{}) error
        • TODO….
    • 十三、WebSocket篇
        • type WSClient interface
        • func WsClient(host, path string, isSSL bool) (WSClient, error)
        • func (c \*webSocketClient) Send(body []byte) error
        • func (c \*webSocketClient) Close()
        • func (c \*webSocketClient) Read(data []byte) error
    • 十四、TCP/UDP篇
        • type TcpClient struct
        • func NewTcpClient() *TcpClient
        • func (c *TcpClient) Send(b []byte) (int, error)
        • func (c *TcpClient) Read(b []byte) (int, error)
        • func (c *TcpClient) Addr() string
        • func (c *TcpClient) Close()
        • func (c *TcpClient) Stop()
        • func (c *TcpClient) ReConn()
        • func (c *TcpClient) Run(serverHost string, r func(c *TcpClient, data []byte), w func(c *TcpClient))
        • 实例
        • func NewUdpClient() *UdpClient
        • func (u *UdpClient) Send(b []byte) (int, error)
        • func (u *UdpClient) Read(b []byte) (int, *net.UDPAddr, error)
        • func (u *UdpClient) Addr() string
        • func (u *UdpClient) Close()
        • func (u *UdpClient) Run(hostServer string, port int, r func(u *UdpClient, data []byte), w func(u *UdpClient))
    • 十五、SSH篇
        • func SSHClient(user string, pass string, addr string) (*ssh.Client, error)
    • 十六、代理&Socket5
        • func SocketProxy(addr string)
        • type Intercept struct
        • func (ipt *Intercept) RunServer()
        • func (ipt *Intercept) RunHttpIntercept()
        • type HttpPackage struct
        • func (pack *HttpPackage) Img2Base64() string
        • func (pack *HttpPackage) Html() string
        • func (pack *HttpPackage) SaveImage(path string) error
        • func (pack *HttpPackage) Json() string
        • func (pack *HttpPackage) Txt() string
        • func (pack *HttpPackage) ToFile(path string) error
        • 实例
    • TODO…
    • 未完待续…

一、介绍

1.1 简介

  • gathertool是golang脚本化开发集成库,目的是提高对应场景脚本程序开发的效率;
  • gathertool也是一款轻量级爬虫库,特色是分离了请求事件,通俗点理解就是对请求过程状态进行事件处理。
  • gathertool也是接口测试&压力测试库,在接口测试脚本开发上有明显的效率优势,
  • gathertool还集成了对三方中间件的操作,DB操作等。

1.2 使用

go get github.com/mangenotwork/gathertool


1.3 介绍

gathertool是一个高度封装工具库,包含了http/s的请求,Mysql数据库方法,数据类型处理方法,数据提取方法,websocket相关方法,
TCP|UDP相关方法,NoSql相关方法,开发常用方法等; 可以用于爬虫程序,接口&压力测试程序,常见网络协议调试程序,数据提取与存储程序等;
gathertool的请求特点: 会在请求阶段执行各个事件如请求失败后的重试事件,请求前后的事件,请求成功事件等等, 可以根据请求状态码自定义这些事件;
gathertool还拥有很好的可扩展性, 适配传入任意自定义http请求对象, 能适配各种代理对象等等;
gathertool还拥有抓取数据存储功能, 比如存储到mysql, redis, mongo, pgsql等等; 还有很多创新的地方文档会根据具体方法进行介绍;
gathertool还封装了消息队列接口,支持Nsq,Kafka,rabbitmq,redis等消息队列中间件


1.4 使用场景

  1. 爬虫脚本开发
  2. 接口测试&压力测试脚本开发
  3. http/s代理服务器, socket5代理服务器
  4. mysql相关操作方法
  5. redis相关操作方法
  6. mongo相关操作方法
  7. 数据提取&清洗相关操作
  8. Websocket相关操作方法
  9. TCP客户端
  10. UDP客户端
  11. SSH客户端
  12. 加密解密脚本开发
  13. ip扫描,端口扫描脚本开发
  14. 消息队列

1.5 简单例子

简单的get请求

import gt "github.com/mangenotwork/gathertool"func main(){ctx, err := gt.Get("https://www.baidu.com")if err != nil {log.Println(err)}log.Println(ctx.Html)
}

含请求事件请求

import gt "github.com/mangenotwork/gathertool"func main(){ctx := gt.NewGet(`http://192.168.0.1`)ctx.SetStartFunc(func(ctx *gt.Context){log.Println("请求前: 添加代理等等操作")ctx.Client.Transport = &http.Transport{Proxy: http.ProxyURL(proxyUrl)}})ctx.SetSucceedFunc(func(ctx *gt.Context){log.Println("请求成功: 处理数据或存储等等")log.Println(ctx.RespBodyString())})ctx.SetFailedFunc(func(ctx *gt.Context){log.Println("请求失败: 记录失败等等")log.Println(ctx.Err)})ctx.SetRetryFunc(func(ctx *gt.Context){log.Println("请求重试: 更换代理或添加等待时间等等")ctx.Client.Transport = &http.Transport{Proxy: http.ProxyURL(proxyUrl)}})ctx.SetEndFunc(func(ctx *gt.Context){log.Println("请求结束: 记录结束,处理数据等等")log.Println(ctx)})ctx.Do()log.Println(ctx.Html)
}

事件方法复用

func main(){gt.NewGet(`http://192.168.0.1`).SetSucceedFunc(succeed).SetFailedFunc(failed).SetRetryFunc(retry).Do()gt.NewGet(`http://www.baidu.com`).SetSucceedFunc(baiduSucceed).SetFailedFunc(failed).SetRetryFunc(retry).Do()
}// 请求成功: 处理数据或存储等等
func succeed(ctx *gt.Context){log.Println(ctx.RespBodyString())
}// 请求失败: 记录失败等等
func failed(ctx *gt.Context){log.Println(ctx.Err)
}// 请求重试: 更换代理或添加等待时间等等
func retry(ctx *gt.Context){ctx.Client.Transport = &http.Transport{Proxy: http.ProxyURL(proxyUrl)}
}// 百度请求成功后
func baiduSucceed(ctx *gt.Context){log.Println(ctx.RespBodyString())
}

post请求

 // FormDatapostData := gt.FormData{"aa":"aa",	}// headerheader := gt.NewHeader(map[string]string{"Accept":"*/*","X-MicrosoftAjax":"Delta=true","Accept-Encoding":"gzip, deflate","XMLHttpRequest":"XMLHttpRequest","Content-Type":"application/x-www-form-urlencoded; charset=UTF-8",})// cookiecookie := gt.Cookie{"aa":"a"}// 随机休眠 2~6秒sleep := gt.SetSleep(2,6)c := gt.NewPostForm(caseUrl, postData, header, cookie, sleep)c.Do()html := c.RespBodyString()log.Print(html)

数据存储到mysql

var (host   = "192.168.0.100"port      = 3306user      = "root"password  = "root123"dbName  = "dbName"db,_ = gt.NewMysql(host, port, user, password, dbName)
)//.... 执行抓取
data1 := "data1"
data2 := "data2"inputdata := map[string]interface{} {"data1" : data1,"data2" : data2,
}tableName := "data"
db.Spider2022DB.InsertAt(tableName, inputdata)

HTML数据提取

func main(){date := "2022-07-05"caseUrl := "***"ctx, _ := gt.Get(fmt.Sprintf(caseUrl, date))datas, _ := gt.GetPointHTML(ctx.Html, "div", "id", "domestic")Data(datas, date, "内期表", "备注:内期表=国内期货主力合约表")datas, _ = gt.GetPointHTML(ctx.Html, "div", "id", "overseas")Data(datas, date, "外期表", "备注:外期表=国外期货主力合约表")
}func Data(datas []string, date, typeName, note string) {for _, data := range datas {table, _ := gt.GetPointHTML(data, "table", "id", "fdata")if len(table) > 0 {trList := gt.RegHtmlTr(table[0])jys := ""for _, tr := range trList {td := gt.RegHtmlTd(tr)log.Println("td = ", td, len(td))if len(td) == 1 {jys = gt.RegHtmlTdTxt(td[0])[0]continue}name := gt.RegHtmlTdTxt(td[0])[0]if strings.Index(name, "商品名称") != -1 {continue}zlhy := gt.RegHtmlTdTxt(td[1])[0]jsj := gt.RegHtmlTdTxt(td[2])[0]zd := gt.RegDelHtml(gt.RegHtmlTdTxt(td[3])[0])cjj := gt.RegHtmlTdTxt(td[4])[0]ccl := gt.RegHtmlTdTxt(td[5])[0]dw := gt.RegHtmlTdTxt(td[6])[0]log.Println("日期 = ", date)log.Println("机构 = ", jys)log.Println("商品名称 = ", name)log.Println("主力合约 = ", zlhy)log.Println("结算价 = ", jsj)log.Println("涨跌 = ", zd)log.Println("成交量 = ", cjj)log.Println("持仓量 = ", ccl)log.Println("单位 = ", dw)}}}
}

Json数据提取

func main(){txt := `{"reason":"查询成功!","result":{"city":"苏州","realtime":{"temperature":"17","humidity":"69","info":"阴","wid":"02","direct":"东风","power":"2级","aqi":"30"},"future":[{"date":"2021-10-25","temperature":"12\/21℃","weather":"多云","wid":{"day":"01","night":"01"},"direct":"东风"},{"date":"2021-10-26","temperature":"13\/21℃","weather":"多云","wid":{"day":"01","night":"01"},"direct":"东风转东北风"},{"date":"2021-10-27","temperature":"13\/22℃","weather":"多云","wid":{"day":"01","night":"01"},"direct":"东北风"}]},"error_code":0
}`jx1 := "/result/future/[0]/date"jx2 := "/result/future/[0]"jx3 := "/result/future"log.Println(gt.JsonFind(txt, jx1))log.Println(gt.JsonFind2Json(txt, jx2))log.Println(gt.JsonFind2Json(txt, jx3))log.Println(gt.JsonFind2Map(txt, jx2))log.Println(gt.JsonFind2Arr(txt, jx3))}

1.6 实例

  • Get请求
  • 阳光高考招生章程抓取
  • ip地址信息抓取
  • 压力测试
  • 文件下载
  • 无登录微博抓取
  • 百度题库抓取
  • 搭建http/s代理与抓包
  • 搭建socket5代理
  • 商品报价信息抓取
  • 期货信息抓取
  • 行业信息网行业分类

二、请求

2.1 请求事件

gathertool的特色之一就是纳入了请求事件,一个请求拥有请求前,请求后,根据指定状态码触发请求成功事件,请求失败事件,请求重试事件;每一种事件都可以去完成自定义的业务,可以进行随意搭配使用。


StartFunc(func (ctx *Context))

请求前执行的事件函数类型;


SucceedFunc(func (ctx *Context))

请求成功后的事件函数类型;请求错误与默认状态码(参见默认状态码事件)会触发;


FailedFunc(func (ctx *Context))

请求失败后的事件函数类型, 请求错误与默认状态码(参见默认状态码事件)会触发;


RetryFunc(func (ctx *Context))

请求重试前的事件函数类型, 默认状态码(参见默认状态码事件)会触发, 可以在此事件更换代理,添加等待时间等等, 重试次数默认是10次,可自行设置;


EndFunc(func (ctx *Context))

请求结束后的事件函数类型;


func (c *Context) SetSucceedFunc(successFunc func(c *Context)) *Context

设置成功后的方法


func (c *Context) SetFailedFunc(failedFunc func(c *Context)) *Context

设置错误后的方法


func (c *Context) SetRetryFunc(retryFunc func(c *Context)) *Context

设置重试,在重试前的方法


例子1:

import gt "github.com/mangenotwork/gathertool"func main(){ctx := gt.NewGet(`http://192.168.0.1`)ctx.SetStartFunc(func(ctx *gt.Context){log.Println("请求前: 添加代理等等操作")ctx.Client.Transport = &http.Transport{Proxy: http.ProxyURL(proxyUrl)}})ctx.SetSucceedFunc(func(ctx *gt.Context){log.Println("请求成功: 处理数据或存储等等")log.Println(ctx.RespBodyString())})ctx.SetFailedFunc(func(ctx *gt.Context){log.Println("请求失败: 记录失败等等")log.Println(ctx.Err)})ctx.SetRetryFunc(func(ctx *gt.Context){log.Println("请求重试: 更换代理或添加等待时间等等")ctx.Client.Transport = &http.Transport{Proxy: http.ProxyURL(proxyUrl)}})ctx.SetEndFunc(func(ctx *gt.Context){log.Println("请求结束: 记录结束,处理数据等等")log.Println(ctx)})ctx.Do()log.Println(ctx.Html)
}

例子2:

import gt "github.com/mangenotwork/gathertool"func main(){ctx,_ := gt.Get(`http://192.168.0.1`, gt.StartFunc(Start), gt.SucceedFunc(Succeed), gt.FailedFunc(Failed), gt.RetryFunc(Retry), gt.EndFunc(End) )log.Println(ctx.Html)
}func Start(ctx *gt.Context){log.Println("请求前: 添加代理等等操作")ctx.Client.Transport = &http.Transport{Proxy: http.ProxyURL(proxyUrl)}
}func Succeed(ctx *gt.Context){log.Println("请求成功: 处理数据或存储等等")log.Println(ctx.RespBodyString())
}func Failed(ctx *gt.Context){log.Println("请求失败: 记录失败等等")log.Println(ctx.Err)
}func Retry(ctx *gt.Context){log.Println("请求重试: 更换代理或添加等待时间等等")ctx.Client.Transport = &http.Transport{Proxy: http.ProxyURL(proxyUrl)}
}func End(ctx *gt.Context){log.Println("请求结束: 记录结束,处理数据等等")log.Println(ctx)
}

2.2 默认状态码事件

状态码对应事件的全局的,可以进行随意修改


func SetStatusCodeSuccessEvent(code int)

将指定状态码设置为执行成功事件


func SetStatusCodeRetryEvent(code int)

将指定状态码设置为执行重试事件


func SetStatusCodeFailEvent(code int)

将指定状态码设置为执行失败事件


默认状态码事件表:

状态码 事件类型 事件描述
200 success 请求成功后事件
201 success 请求成功后事件
202 success 请求成功后事件
203 success 请求成功后事件
204 fail 请求失败后事件
300 success 请求成功后事件
301 success 请求成功后事件
302 success 请求成功后事件
400 fail 请求失败后事件
401 retry 请求重试前的事件
402 retry 请求重试前的事件
403 retry 请求重试前的事件
404 fail 请求失败后事件
405 retry 请求重试前的事件
406 retry 请求重试前的事件
407 retry 请求重试前的事件
408 retry 请求重试前的事件
500 fail 请求失败后事件
501 fail 请求失败后事件
502 retry 请求重试前的事件
503 retry 请求重试前的事件
504 retry 请求重试前的事件

列子:

import gt "github.com/mangenotwork/gathertool"
gt.SetStatusCodeSuccessEvent(412) // 指定412状态码执行成功请求事件
gt.SetStatusCodeRetryEvent(413) // 指定413状态码执行重试请求事件

2.3 事件转换

事件是可以进行强制转换的;比较常用的操作,遇到错误就重试请求。


func (c *Context) OpenErr2Retry()

开启请求失败都执行retry请求事件

import gt "github.com/mangenotwork/gathertool"ctx := gt.NewGet(`http://192.168.0.1`)
ctx.OpenErr2Retry() 
ctx.Do()

2.4 请求头

gathertool 有UserAgent Map 是全局的,可自定义,可扩展等; 在不设置的情况下请求默认会使用 PCAgent随机的一个

类型 描述
PCAgent 1 pc端的useragent
WindowsAgent 2 Windows useragent
LinuxAgent 3 Linux useragent
MacAgent 4 Mac useragent
AndroidAgent 5 Android useragent
IosAgent 6 Ios useragent
PhoneAgent 7 Phone useragent
WindowsPhoneAgent 8 WindowsPhone useragent
UCAgent 9 UC useragent

func GetAgent(agentType UserAgentType) string

随机获取 user-agent


func SetAgent(agentType UserAgentType, agent string)

设置 user-agent

import gt "github.com/mangenotwork/gathertool"
userAgent := gt.GetAgent(gt.WindowsAgent)
gt.SetAgent(LinuxAgent, userAgent)

2.5 重试

默认重试是10次,也可以修改重试次数;也可以及时关闭重试;

func (c *Context) GetRetryTimes() int

获取当前重试次数


func (c *Context) CloseRetry()

关闭重试

import gt "github.com/mangenotwork/gathertool"func mian(){gt.Get(`http://192.168.0.1`,gt.SetRetryFunc(succeed))
}func retry(ctx *gt.Context) {// 超过3次重试就关闭if ctx.GetRetryTimes > 3 {ctx.CloseRetry()}
}

func (c *Context) SetRetryTimes(times int) *Context

设置重试次数

import gt "github.com/mangenotwork/gathertool"func mian(){ctx := gt.NewGet(`http://192.168.0.1`)ctx.SetRetryTimes(5) // 指定当前请求最多重试5次ctx.Do()
}

2.6 请求上下文 Context

这就是一个请求的主体,一个请求可以是三连续,也可以是一次性的,下面是一个请求的方法介绍

func (c *Context) SetSucceedFunc(successFunc func(c *Context)) *Context

设置成功后的方法

ctx.SetStartFunc(func(ctx *gt.Context){log.Println("请求前: 添加代理等等操作")ctx.Client.Transport = &http.Transport{Proxy: http.ProxyURL(proxyUrl)}})

func (c *Context) SetFailedFunc(failedFunc func(c *Context)) *Context

设置错误后的方法

ctx.SetFailedFunc(func(ctx *gt.Context){log.Println("请求成功: 处理数据或存储等等")log.Println(ctx.RespBodyString())})

func (c *Context) SetRetryFunc(retryFunc func(c *Context)) *Context

设置重试,在重试前的方法

ctx.SetRetryFunc(func(ctx *gt.Context){log.Println("请求重试: 更换代理或添加等待时间等等")ctx.Client.Transport = &http.Transport{Proxy: http.ProxyURL(proxyUrl)}})

func (c *Context) SetRetryTimes(times int) *Context

设置重试次数

ctx.SetRetryTimes(3)

func (c *Context) GetRetryTimes() int

获取当前重试次数

times := ctx.GetRetryTimes()

func (c *Context) Do() func()

执行请求

ctx := gt.NewGet(`http://192.168.0.1?a=aaa&b=bbb`)
ctx.Do()
log.Println(ctx.RespBodyString())

func (c *Context) RespBodyString() string

Body -> String

log.Println(ctx.RespBodyString())

func (c *Context) RespBodyHtml() string

Body html string

log.Println(ctx.RespBodyHtml())

func (c *Context) RespBodyMap() map[string]interface{}

Body -> Map

log.Println(ctx.RespBodyMap())

func (c *Context) RespBodyArr() []interface{}

Body -> Arr

log.Println(ctx.RespBodyArr())

func (c *Context) GetRespHeader() string

获取 Response 的header


func (c *Context) RespContentLength() int64

获取Response 的 ContentLength


func (c *Context) CheckReqMd5() string

这次请求Request的md5值,是唯一的,应用场景: 记录每次请求的唯一性排除重复请求等


func (c *Context) CheckMd5() string

这次请求的md5值,是唯一的


func (c *Context) AddHeader(k,v string) *Context

添加请求 header


func (c *Context) AddCookie(k, v string) *Context

添加请求cookie


func (c *Context) SetProxy(proxyUrl string) *Context

设置代理


func (c *Context) SetProxyFunc(f func() *http.Transport) *Context

设置代理函数


func (c *Context) SetProxyPool(pool *ProxyPool) *Context

设置代理池,会依次获取代理


func (c *Context) Upload(filePath string) func()

下载


func (c *Context) CookieNext() error

使用上次请求返回的cookie


func (c *Context) CloseLog()

关闭打印日志


func (c *Context) OpenErr2Retry()

开启请求失败都执行retry


func (c *Context) CloseRetry()

关闭重试


func (c *Context) GetParam(key string) interface{}

获取上下文参数


func (c *Context) AddParam(key string, val interface{})

添加上下文参数


func (c *Context) DelParam(key string)

删除上下文参数


func (c *Context) Upload(filePath string) func()

下载


2.7 Context 的成员

// Context 请求上下文
type Context struct {// TokenToken string// http clientClient *http.Client// http RequestReq *http.Request// http ResponseResp *http.Response// ErrorErr error// Ctx context.ContextCtx context.Context// 执行的次数 初始化都是0times RetryTimes// 最大允许重试次数MaxTimes RetryTimes// 请求成功了需要处理的事件SucceedFunc SucceedFunc// 请求失败了需要做的事FailedFunc FailedFunc// 请求状态码设置了重试,在重试前的事件RetryFunc RetryFunc// 请求开始前的方法StartFunc StartFunc// 请求完成后的方法EndFunc EndFunc// 本次请求的任务// 用于有步骤的请求和并发执行请求Task *Task// 请求返回的结果RespBody []byte// job编号// 在执行多并发执行抓取任务,每个并发都有一个编号// 这个编号是递增分配的JobNumber int// 请求的响应时间 单位msMs time.Duration// 是否显示日志, 默认是显示的IsLog IsLog// 指定失败执行重试事件err2retry bool// 是否关闭重试isRetry bool// 休眠时间sleep Sleep// 输出字符串Text string// 输出JsonJson string// 输出xmlXml string// 输出HTMLHtml string// 请求上下文参数Param map[string]interface{}
}

三、请求使用

3.1 Get

func Get(url string) (*Context, error)

import gt "github.com/mangenotwork/gathertool"ctx, err := gt.Get(`http://192.168.0.1`)
log.Println(ctx.RespBodyString(), err)

func NewGet(url string) *Context

新建一个get请求

ctx := gt.NewGet(`http://192.168.0.1?a=aaa&b=bbb`)
ctx.Do()
log.Println(ctx.RespBodyString())

3.2 Post

func Post(url string, data []byte, contentType string) (*Context, error)

ctx, err := gt.Post(`https://httpbin.org/post`, []byte(`{"a":"a"}`), "application/json;")
log.Println(ctx.RespBodyString(), err)

func NewPost(url string, data []byte, contentType string) *Context

ctx := gt.NewPost(`https://httpbin.org/post`, []byte(`{"a":"a"}`), "application/json;")
ctx.Do()
log.Println(ctx.RespBodyString())

func PostJson(url string, jsonStr string) (*Context, error)

ctx, err := gt.PostJson(`https://httpbin.org/post`, `{"a":"a"}`)
log.Println(ctx.RespBodyString(), err)

func PostForm(url string, data url.Values) (*Context, error)

formData := map[string]string{"a":"a",
}
ctx, err := gt.PostForm(`https://httpbin.org/post`, formData)
log.Println(ctx.RespBodyString(), err)

func NewPostForm(u string, data map[string]string, vs …interface{}) *Context


func PostFile(url, paramName, filePath string, vs …interface{}) *Context

ctx := gt.PostFile(`http:/192.168.0.9:8888`, "file", "/home/test.txt")
ctx.Do
log.Println(ctx.RespBodyString(), err)

3.3 Put

func Put(url string, data []byte, contentType string, vs …interface{}) (*Context, error)


func NewPut(url string, data []byte, contentType string, vs …interface{}) *Context

3.4 Delete

func Delete(url string, vs …interface{}) (*Context, error)


func NewDelete(url string, vs …interface{}) *Context


3.5 Options

func Options(url string, vs …interface{}) (*Context, error)


func NewOptions(url string, vs …interface{}) *Context


3.6 Upload

func Upload(url, savePath string, vs …interface{}) (*Context, error)

ctx, err := gt.PostFile(`http:/192.168.0.9:8888/file/txt1.txt`, "/home/txt1.txt")
log.Println(ctx.RespBodyString(), err)

3.7 代理

代理ip

type ProxyIP struct {IP stringPost intUser stringPass stringIsTLS bool
}

func NewProxyIP(ip string, port int, user, pass string, isTls bool) *ProxyIP

ip := gt.NewProxyIP("127.0.0.1",1981, "", "", false)

func (p *ProxyIP) String() string


type ProxyPool struct

代理池


func NewProxyPool() *ProxyPool

新建代理池

ProxyPool = gt.NewProxyPool()
ProxyPool.Add(gt.NewProxyIP("120.26.170.171",1981, "wahaha", "993126", false))
ProxyPool.Add(gt.NewProxyIP("8.134.60.130",1981, "wahaha", "993126", false))

func (p *ProxyPool) Add(proxyIP *ProxyIP)

添加代理到代理池


func (p *ProxyPool) Get() (string, int)

获取一个代理,是依次获取。 返回的第二个参数是这个代理在代理池的位置


func (p *ProxyPool) Del(n int)

移除一个代理,传人参数的代理的位置

3.8 Cookie

var CookiePool *cookiePool

cookie池


func NewCookiePool() *cookiePool


func (c *cookiePool) Add(cookie *http.Cookie)

代理池添加代理


func (c *cookiePool) Get() *http.Cookie

代理池按获取顺序获取一个代理


func (p *ProxyPool) Del(n int)

代理池删除代理


func (c *Context) CookieNext() error

CookieNext 使用上下文cookies


3.9 Header

type Header map[string]string


func NewHeader(data map[string]string) Header

NewHeader 新建Header


func (h Header) Set(key, value string) Header

Set Header Set


func (h Header) Delete(key string) Header

Delete Header Delete


func (c *Context) AddHeader(k,v string) *Context

AddHeader 给请求添加Header


func (c *Context) GetRespHeader() string

GetRespHeader 获取Response的Header


3.10 Body

func (c *Context) RespBodyString() string

RespBodyString 请求到的Body转换为string类型


func (c *Context) RespBodyHtml() string

RespBodyHtml 请求到的Body转换为string类型的html格式


func (c *Context) RespBodyMap() map[string]interface{}

RespBodyMap 请求到的Body转换为map[string]interface{}类型


func (c *Context) RespBodyArr() []interface{}

RespBodyArr 请求到的Body转换为[]interface{}类型


func (c *Context) RespContentLength() int64

RespContentLength 获取Response ContentLength的值


func (c *Context) CheckReqMd5() string

CheckReqMd5 本次请求的md5值, url+reqBodyBytes+method


func (c *Context) CheckMd5() string

CheckMd5 本次请求上下文包含输出结果的md5值


3.11 日志

func (c *Context) CloseLog()

CloseLog 关闭日志打印


func CloseLog()

CloseLog 关闭日志


func SetLogFile(name string)

SetLogFile 设置日志输出到的指定文件


func (l *logger) Log(level Level, args string, times int)

Log 日志


func Info(args …interface{})

Info 日志-信息


func Infof(format string, args …interface{})

Infof 日志-信息 模板输出


func InfoTimes(times int, args …interface{})

InfoTimes 日志-信息, 指定日志代码位置的定位调用层级


func InfofTimes(format string, times int, args …interface{})

InfofTimes 日志-信息 模板输出, 指定日志代码位置的定位调用层级


func Debug(args …interface{})

Debug 日志-调试


func Debugf(format string, args …interface{})

Debugf 日志-调试 模板输出


func DebugTimes(times int, args …interface{})

DebugTimes 日志-调试, 指定日志代码位置的定位调用层级


func DebugfTimes(format string, times int, args …interface{})

DebugfTimes 日志-调试 模板输出, 指定日志代码位置的定位调用层级


func Warn(args …interface{})

Warn 日志-警告


func Warnf(format string, args …interface{})

Warnf 日志-警告 模板输出


func WarnTimes(times int, args …interface{})

WarnTimes 日志-警告, 指定日志代码位置的定位调用层级


func WarnfTimes(format string, times int, args …interface{})

WarnfTimes 日志-警告 模板输出, 指定日志代码位置的定位调用层级


func Error(args …interface{})

Error 日志-错误


func Errorf(format string, args …interface{})

Errorf 日志-错误 模板输出


func ErrorTimes(times int, args …interface{})

ErrorTimes 日志-错误, 指定日志代码位置的定位调用层级


func ErrorfTimes(format string, times int, args …interface{})

ErrorfTimes 日志-错误 模板输出, 指定日志代码位置的定位调用层级


3.12 参数

func (c *Context) GetParam(key string) interface{}

GetParam 获取上下文参数


func (c *Context) AddParam(key string, val interface{})

AddParam 添加上下文参数


func (c *Context) DelParam(key string)

DelParam 删除上下文参数


3.13 进度条

type Bar struct

Bar 终端显示的进度条


func (bar *Bar) NewOption(start, total int64)


func (bar *Bar) NewOptionWithGraph(start, total int64, graph string)


func (bar *Bar) Play(cur int64)


func (bar *Bar) Finish()


实例

// ToXls 数据库查询输出到excel
func (m *Mysql) ToXls(sql, outPath string) {data, err := m.Select(sql)if err != nil {Error(err)return}if len(data) < 1 {Error("查询数据为空")return}f := excelize.NewFile()count := len(data)var bar Barbar.NewOption(0, int64(count-1))fields := make([]string, 0)n := 1for k, _ := range data[0] {fields = append(fields, k)_ = f.SetCellValue("Sheet1", toNumberSystem26(n)+"1", k)n++}// 写入数据for i := 0; i < count; i++ {n := 1for _, v := range fields {_ = f.SetCellValue("Sheet1", fmt.Sprintf("%s%d", toNumberSystem26(n), i+2), data[i][v])n++}bar.Play(int64(i))}bar.Finish()if err := f.SaveAs(outPath); err != nil {Error("[err] 导出失败: ", err)return}workPath, _ := os.Getwd()Info("[导出成功] 文件位置: ", workPath+"/"+outPath)
}

3.14 其他

func (c *Context) OpenErr2Retry()

OpenErr2Retry 开启请求失败都执行retry


func (c *Context) CloseRetry()

CloseRetry 关闭重试


func SearchPort(ipStr string, vs …interface{})

SearchPort 扫描ip的端口


func Ping(ip string)

Ping ping IP


四、常用方法

4.1 类型转换

func Any2String(data interface{}) string

任何类型返回值字符串类型


func Json2Map(str string) map[string]interface{}

json -> map


func Map2Json(m map[string]interface{}) (string, error)

map -> json


func Any2Map(data interface{}) map[string]interface{}

interface{} -> map[string]interface{}


func Any2Int(data interface{}) int

interface{} -> int


func Any2int64(data interface{}) int64

interface{} -> int64


func Any2Arr(data interface{}) []interface{}

interface{} -> []interface{}


func Any2Float64(data interface{}) float64

interface{} -> float64


func Any2Strings(data interface{}) []string

interface{} -> []string


func Any2Json(data interface{}) (string, error)

interface{} -> json string


func Int2Hex(i int64) string

int -> hex string


func Int642Hex(i int64) string

int64 -> hex string


func Hex2Int(s string) int

hex string -> int


func Hex2Int64(s string) int64

hex string -> int


func Str2Int64(str string) int64

string -> int64


func Str2Int(str string) int

string -> int


func Str2Int32(str string) int32

string -> int32


func Str2Float64(str string) float64

string -> float64


func Str2Float32(str string) float32

string -> float32


func Uint82Str(bs []uint8) string

[]uint8 -> string


func Str2Byte(s string) []byte

string -> []byte


func Byte2Str(b []byte) string

[]byte -> string


func Bool2Byte(b bool) []byte

bool -> []byte


func Byte2Bool(b []byte) bool

[]byte -> bool


func Int2Byte(i int) []byte

int -> []byte


func Byte2Int(b []byte) int

[]byte -> int


func Int642Byte(i int64) []byte

int64 -> []byte


func Byte2Int64(b []byte) int64

[]byte -> int64


func Float322Byte(f float32) []byte

float32 -> []byte


func Float322Uint32(f float32) uint32

float32 -> uint32


func Byte2Float32(b []byte) float32

[]byte -> float32


func Float642Byte(f float64) []byte

float64 -> []byte


func Float642Uint64(f float64) uint64

float64 -> uint64


func Byte2Float64(b []byte) float64

[]byte -> float64


func Byte2Bit(b []byte) []uint8

[]byte -> []uint8 (bit)


func Bit2Byte(b []uint8) []byte

[]uint8 -> []byte


func Struct2Map(obj interface{}, hasValue bool) (map[string]interface{}, error)

Struct -> map

4.2 字符串相关

func MD5(str string) string

MD5


func CleaningStr(str string) string

清理字符串前后空白 和回车 换行符号


func StrDeleteSpace(str string) string

删除字符串前后的空格


func IsContainStr(items []string, item string) bool

字符串是否等于items中的某个元素


4.3 其他

func OSLine() string

系统对应换行符


func EncodeByte(v interface{}) []byte

encode byte


func DecodeByte(b []byte) (interface{}, error)

decode byte


func FileSizeFormat(fileSize int64) (size string)

字节的单位转换 保留两位小数


func DeepCopy(dst, src interface{}) error

深copy


func FileMd5(path string) (string, error)

文件md5


func PathExists(path string)

目录不存在则创建


func StrDuplicates(a []string) []string

数组,切片去重和去空串


func windowsPath(path string) string

windows平台需要转一下


func GetNowPath() string

获取当前运行路径


func FileMd5sum(fileName string) string

文件 Md5


func SearchBytesIndex(bSrc []byte, b byte) int

[]byte 字节切片 循环查找


func IF(condition bool, a, b interface{}) interface{}

三元表达式 use: IF(a>b, a, b).(int)


func CopySlice(s []interface{}) []interface{}

Copy slice


func CopySliceStr(s []string) []string

Copy string slice


func CopySliceInt(s []int) []int

Copy int slice


func CopySliceInt64(s []int64) []int64

Copy int64 slice


func IsInSlice(s []interface{}, v interface{}) bool

is in slice


func ReplaceAllToOne(str string, from []string, to string) string

批量统一替换字符串


func Exists(path string) bool


func IsDir(path string) bool


func Pwd() string


func Chdir(dir string) error


func HumanFriendlyTraffic(bytes uint64) string

func StrToSize(sizeStr string) int64

字节换算


4.4 字符转码,编码解码

func ConvertByte2String(byte []byte, charset Charset) string

编码转换

  • UTF8 = Charset(“UTF-8”)
  • GB18030 = Charset(“GB18030”)
  • GBK = Charset(“GBK”)
  • GB2312 = Charset(“GB2312”)

func UnicodeDec(raw string) string


func UnicodeDecByte(raw []byte) []byte

Unicode 解码


func UnescapeUnicode(raw []byte) ([]byte, error)

Unicode 转码


func Base64Encode(str string) string

base64 编码


func Base64Decode(str string) (string,error)

base64 解码


func Base64UrlEncode(str string) string

base64 url 编码


func Base64UrlDecode(str string) (string,error)

base64 url 解码


func ToUTF8(srcCharset string, src string) (dst string, err error)

其他编码转为UTF8

ToUTF8("GB2312", "你好")

func UTF8To(dstCharset string, src string) (dst string, err error)

UTF8转其他编码

UTF8To("GB2312", "assdsdfdsf")

func ToUTF16(srcCharset string, src string) (dst string, err error)

ToUTF16


func UTF16To(dstCharset string, src string) (dst string, err error)

UTF16To


func ToBIG5(srcCharset string, src string) (dst string, err error)

ToBIG5


func BIG5To(dstCharset string, src string) (dst string, err error)

BIG5To


func ToGDK(srcCharset string, src string) (dst string, err error)

ToGDK


func GDKTo(dstCharset string, src string) (dst string, err error)

GDKTo


func ToGB18030(srcCharset string, src string) (dst string, err error)

ToGB18030


func GB18030To(dstCharset string, src string) (dst string, err error)

GB18030To


func ToGB2312(srcCharset string, src string) (dst string, err error)

ToGB2312


func GB2312To(dstCharset string, src string) (dst string, err error)

GB2312To


func ToHZGB2312(srcCharset string, src string) (dst string, err error)

ToHZGB2312


func HZGB2312To(dstCharset string, src string) (dst string, err error)

HZGB2312To


4.5 集合

type Set map[string]struct{}


func (s Set) Has(key string) bool


func (s Set) Add(key string)


func (s Set) Delete(key string)

4.6 栈

type Stack struct


func New() *Stack


func (s *Stack) Push(data interface{})


func (s *Stack) Pop()


func (s *Stack) String() string


4.7 Map

func MapCopy(data map[string]interface{}) (copy map[string]interface{})

map 深copy


func MapMergeCopy(src …map[string]interface{}) (copy map[string]interface{})

多个map 合并为一个新的map


func Map2Slice(data interface{}) []interface{}

Map2Slice Eg: {“K1”: “v1”, “K2”: “v2”} => [“K1”, “v1”, “K2”, “v2”]

4.8 固定顺序Map

GDMapApi 固定顺序 Map 接口

type GDMapApi interface {Add(key string, value interface{}) *gDMapGet(key string) interface{}Del(key string) *gDMapLen() intKeyList() []stringAddMap(data map[string]interface{}) *gDMapRange(f func(k string, v interface{})) *gDMapRangeAt(f func(id int, k string, v interface{})) *gDMapCheckValue(value interface{}) bool // 检查是否存在某个值Reverse()                          //反序
}

func NewGDMap() *gDMap

NewGDMap ues: NewGDMap().Add(k,v)


func (m *gDMap) Add(key string, value interface{}) *gDMap

Add 添加kv

NewGDMap().Add("a", 1).Add("b",2)

func (m *gDMap) Get(key string) interface{}

Get 通过key获取值


func (m *gDMap) Del(key string) *gDMap

Del 删除指定key的值

NewGDMap().Del("a", 1).Del("b",2)

func (m *gDMap) Len() int

Len map的长度


func (m *gDMap) KeyList() []string

KeyList 打印map所有的key


func (m *gDMap) AddMap(data map[string]interface{}) *gDMap

AddMap 写入map


func (m *gDMap) Range(f func(k string, v interface{})) *gDMap

Range 遍历map


func (m *gDMap) RangeAt(f func(id int, k string, v interface{})) *gDMap

RangeAt Range 遍历map含顺序id


func (m *gDMap) CheckValue(value interface{}) bool

CheckValue 查看map是否存在指定的值


func (m *gDMap) Reverse()

Reverse map反序


4.9 Slice

func SliceCopy(data []interface{}) []interface{}

slice 深copy


func Slice2Map(slice interface{}) map[string]interface{}

["K1", "v1", "K2", "v2"] => {"K1": "v1", "K2": "v2"}
["K1", "v1", "K2"]       => nil

func SliceTool() *sliceTool

SliceTool use : SliceTool().CopyInt64(a)


func (sliceTool) CopyInt64(a []int64) []int64

CopyInt64 copy int64


func (sliceTool) CopyStr(a []string) []string

CopyStr copy string


func (sliceTool) CopyInt(a []int) []int

CopyInt copy int


func (sliceTool) ContainsByte(a []byte, x byte) bool

ContainsByte contains byte


func (sliceTool) ContainsInt(a []int, x int) bool

ContainsInt contains int


func (sliceTool) ContainsInt64(a []int64, x int64) bool

ContainsInt64 contains int64


func (sliceTool) ContainsStr(a []string, x string) bool

ContainsStr contains str


func (sliceTool) DeduplicateInt(a []int) []int


func (sliceTool) DeduplicateInt64(a []int64) []int64

DeduplicateInt64 deduplicate int64


func (sliceTool) DeduplicateStr(a []string) []string

DeduplicateStr deduplicate string


func (sliceTool) DelInt(a []int, i int) []int

DelInt del int


func (sliceTool) DelInt64(a []int64, i int) []int64

DelInt64 del int64


func (sliceTool) DelStr(a []string, i int) []string

DelStr delete str


func (sliceTool) MaxInt(a []int) int


func (sliceTool) MaxInt64(a []int64) int64


func (sliceTool) MinInt(a []int) int


func (sliceTool) MinInt64(a []int64) int64


func (sliceTool) PopInt(a []int) (int, []int)


func (sliceTool) PopInt64(a []int64) (int64, []int64)


func (sliceTool) PopStr(a []string) (string, []string)


func (sliceTool) ReverseInt(a []int) []int

ReverseInt 反转


func (sliceTool) ReverseInt64(a []int64) []int64

ReverseInt64 reverse int64


func (sliceTool) ReverseStr(a []string) []string

ReverseStr reverseStr


func (sliceTool) ShuffleInt(a []int) []int

ShuffleInt 洗牌


4.10 时间相关方法

func Timestamp() string

时间戳


func BeginDayUnix() int64

获取当天 0点


func EndDayUnix() int64

获取当天 24点


func MinuteAgo(i int) int64

获取多少分钟前的时间戳


func HourAgo(i int) int64

获取多少小时前的时间戳


func DayAgo(i int) int64

获取多少天前的时间戳


func Daydiff(beginDay string, endDay string) int

两个时间字符串的日期差


func TickerRun(t time.Duration, runFirst bool, f func())

间隔运行


func Timestamp2Date(timestamp int64) string


func GetChineseMonthDay(date string) (rMonth, rDay int64)

GetChineseMonthDay 获取农历


func NowToEnd() (int64, error)

NowToEnd 计算当前时间到这天结束还有多久


func IsLeap(year int) bool

IsLeap 是否是闰年


func IsToday(timestamp int64) string

IsToday 判断是否是今天 “2006-01-02 15:04:05”


func IsTodayList(timestamp int64) string

IsTodayList 列表页的时间显示 “01-02 15:04”


func Timestamp2Week(timestamp int64) string


func Timestamp2WeekXinQi(timestamp int64) string


五、数据提取

5.1 正则

func RegFindAll(regStr, rest string) [][]string

正则提取所有

list := RegFindAll(`<option(.*?)</option>`, txt)

func RegHtmlA(str string, property …string) []string

提取a标签

`(?is:<a.*?</a>)`

func RegHtmlTitle(str string, property …string) []string

提取title标签

`(?is:<title.*?</title>)`

func RegHtmlTr(str string, property …string) []string

提取tr标签

`(?is:<tr.*?</tr>)`

func RegHtmlInput(str string, property …string) []string

提取input标签

`(?is:<input.*?>)`

func RegHtmlTd(str string, property …string) []string

提取td标签

`(?is:<td.*?</td>)`

func RegHtmlP(str string, property …string) []string

提取P标签

`(?is:<p.*?</p>)`

func RegHtmlSpan(str string, property …string) []string

提取span标签

`(?is:<span.*?</span>)`

func RegHtmlSrc(str string, property …string) []string

提取src内容

`(?is:src=\".*?\")`

func RegHtmlHref(str string, property …string) []string

提取href内容

`(?is:href=\".*?\")`

func RegHtmlVideo(str string, property …string) []string

提取video内容

`(?is:<video.*?</video>)`

func RegHtmlCanvas(str string, property …string) []string

提取canvas

`(?is:<canvas.*?</canvas>)`

func RegHtmlCode(str string, property …string) []string

提取code标签

`(?is:<code.*?</code>)`

func RegHtmlImg(str string, property …string) []string

提取img标签

`(?is:<img.*?/>)`

func RegHtmlUl(str string, property …string) []string

提取ul标签

`(?is:<ul.*?</ul>)`

func RegHtmlLi(str string, property …string) []string

提取li标签

`(?is:<li.*?</li>)`

func RegHtmlMeta(str string, property …string) []string

提取meta标签

`(?is:<meta.*?>)`

func RegHtmlSelect(str string, property …string) []string

提取select标签

`(?is:<select.*?</select>)`

func RegHtmlTable(str string, property …string) []string

提取table标签

`(?is:<table.*?</table>)`

func RegHtmlButton(str string, property …string) []string

提取button标签

`(?is:<button.*?</button>)`

func RegHtmlH(str, typeH string, property …string) []string

提取h标签

`(?is:<h1.*?</h1>)`

func RegHtmlTbody(str string, property …string) []string

提取Tbody标签

`(?is:<table.*?</table>)`

func RegHtmlATxt(str string, property …string) []string

提取a标签内容非标签部分

`(?is:<a.*?>(.*?)</a>)`

func RegHtmlTitleTxt(str string, property …string) []string

提取title标签内容非标签部分

`(?is:<title.*?>(.*?)</title>)`

func RegHtmlTrTxt(str string, property …string) []string

提取tr标签内容非标签部分

`(?is:<tr.*?>(.*?)</tr>)`

func RegHtmlInputTxt(str string, property …string) []string

提取input标签内容非标签部分

`(?is:<input(.*?)>)`

func RegHtmlTdTxt(str string, property …string) []string

提取td标签内容非标签部分

`(?is:<td.*?>(.*?)</td>)`

func RegHtmlPTxt(str string, property …string) []string

提取p标签内容非标签部分

`(?is:<p.*?>(.*?)</p>)`

func RegHtmlSpanTxt(str string, property …string) []string

提取span标签内容非标签部分

`(?is:<span.*?>(.*?)</span>)`

func RegHtmlSrcTxt(str string, property …string) []string

提取Src内容

`(?is:src=\"(.*?)\")`

func RegHtmlHrefTxt(str string, property …string) []string

提取href内容

`(?is:href=\"(.*?)\")`

func RegHtmlCodeTxt(str string, property …string) []string

提取code标签内容非标签部分

`(?is:<code.*?>(.*?)</code>)`

func RegHtmlUlTxt(str string, property …string) []string

提取ul标签内容非标签部分

`(?is:<ul.*?>(.*?)</ul>)`

func RegHtmlLiTxt(str string, property …string) []string

提取li标签内容非标签部分

`(?is:<li.*?>(.*?)</li>)`

func RegHtmlSelectTxt(str string, property …string) []string

提取select标签内容非标签部分

`(?is:<select.*?>(.*?)</select>)`

func RegHtmlTableTxt(str string, property …string) []string

提取table标签内容非标签部分

`(?is:<table.*?>(.*?)</table>)`

func RegHtmlButtonTxt(str string, property …string) []string

提取button标签内容非标签部分

`(?is:<button.*?>(.*?)</button>)`

func RegHtmlHTxt(str, typeH string, property …string) []string

提取h标签内容非标签部分

`(?is:<h1.*?>(.*?)</h1>)`

func RegDelHtml(str string) string

删除所有标签


func RegDelNumber(str string) string

删除所有数字


func RegDelHtmlA(str string) string

删除所有a标签


func RegDelHtmlTitle(str string) string

删除所有html标签


func RegDelHtmlTr(str string) string

删除所有tr标签


func RegDelHtmlInput(str string, property …string) string

删除所有input标签


func RegDelHtmlTd(str string, property …string) string

删除所有td标签


func RegDelHtmlP(str string, property …string) string

删除所有p标签


func RegDelHtmlSpan(str string, property …string) string

删除所有span标签


func RegDelHtmlSrc(str string, property …string) string

删除所有src


func RegDelHtmlHref(str string, property …string) string

删除所有href


func RegDelHtmlVideo(str string, property …string) string

删除所有video标签


func RegDelHtmlCanvas(str string, property …string) string

删除所有canvas标签


func RegDelHtmlCode(str string, property …string) string

删除所有code标签


func RegDelHtmlImg(str string, property …string) string

删除所有img标签


func RegDelHtmlUl(str string, property …string) string

删除所有ul标签


func RegDelHtmlLi(str string, property …string) string

删除所有li标签


func RegDelHtmlMeta(str string, property …string) string

删除所有meta标签


func RegDelHtmlSelect(str string, property …string) string

删除所有select标签


func RegDelHtmlTable(str string, property …string) string

删除所有table标签


func RegDelHtmlButton(str string, property …string) string

删除所有button标签


func RegDelHtmlH(str, typeH string, property …string) string

删除所有h标签


func RegDelHtmlTbody(str string, property …string) string

删除所有body标签


func IsNumber(str string) bool

验证是否含有number

`^[0-9]*$`

func IsNumber2Len(str string, l int) bool

验证是否含有连续长度不超过长度l的number

`[0-9]{%d}`

func IsNumber2Heard(str string, n int) bool

验证是否含有n开头的number

`^(%d)[0-9]*$`

func IsFloat(str string) bool

验证是否是标准正负小数(123. 不是小数)

 `^(-?\d+\.\d+)?$`

func IsFloat2Len(str string, l int) bool

验证是否含有带不超过len个小数的小数

`^(-?\d+\.\d{%d})?$`

func IsChineseAll(str string) bool

验证是否是全汉字


func IsChinese(str string) bool

验证是否含有汉字


func IsChineseN(str string, number int) bool

验证是否含有number个汉字


func IsChineseNumber(str string) bool

验证是否全是汉字数字


func IsChineseMoney(str string) bool

验证是否是中文钱大写


func IsEngAll(str string) bool

验证是否是全英文

`^[A-Za-z]*$`

func IsEngLen(str string, l int) bool

验证是否含不超过len个英文字符

`^[A-Za-z]{%d}$`

func IsEngNumber(str string) bool

验证是否是英文和数字

`^[A-Za-z0-9]*$`

func IsAllCapital(str string) bool

验证是否全大写


func IsHaveCapital(str string) bool

验证是否有大写


func IsAllLower(str string) bool

验证是否全小写


func IsHaveLower(str string) bool

验证是否有小写


func IsLeastNumber(str string, n int) bool

验证不低于n个数字

`[0-9]{%d,}?`

func IsLeastCapital(str string, n int) bool

验证不低于n个大写字母

`[A-Z]{%d,}?`

func IsLeastLower(str string, n int) bool

验证不低于n个小写字母

`[a-z]{%d,}?`

func IsLeastSpecial(str string, n int) bool

验证不低于n特殊字符

`[\f\t\n\r\v\123\x7F\x{10FFFF}\\\^\&\$\.\*\+\?\{\}\(\)\[\]\|\!\_\@\#\%\-\=]{%d,}?`

func IsDomain(str string) bool

验证域名

`[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?`

func IsURL(str string) bool

验证URL

`//([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$`

func IsPhone(str string) bool

验证手机号码

`^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$`

func IsLandline(str string) bool

验证电话号码(“XXX-XXXXXXX”、“XXXX-XXXXXXXX”、“XXX-XXXXXXX”、“XXX-XXXXXXXX”、"XXXXXXX"和"XXXXXXXX)

`^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$`

func IsIP(str string) bool

IP地址

((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))

func AccountRational(str string) bool

帐号合理性验证

`^[a-zA-Z][a-zA-Z0-9_]{4,15}$`

func IsXMLFile(str string) bool

是否三xml文件

`^*+\\.[x|X][m|M][l|L]$`

func IsUUID3(str string) bool

是否是uuid

`^[0-9a-f]{8}-[0-9a-f]{4}-3[0-9a-f]{3}-[0-9a-f]{4}-[0-9a-f]{12}$`

func IsUUID4(str string) bool

是否是uuid

`^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$`

func IsUUID5(str string) bool

是否是uuid

`^[0-9a-f]{8}-[0-9a-f]{4}-5[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$`

func IsRGB(str string) bool

是否是 rgb

`^rgb\\(\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*\\)$`

func IsFullWidth(str string) bool

是否是全角字符

`[^\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]`

func IsHalfWidth(str string) bool

是否是半角字符

`[\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]`

func IsBase64(str string) bool

是否是base64

`^(?:[A-Za-z0-9+\\/]{4})*(?:[A-Za-z0-9+\\/]{2}==|[A-Za-z0-9+\\/]{3}=|[A-Za-z0-9+\\/]{4})$`

func IsLatitude(str string) bool

是否是纬度

`^[-+]?([1-8]?\\d(\\.\\d+)?|90(\\.0+)?)$`

func IsLongitude(str string) bool

是否是经度

`^[-+]?(180(\\.0+)?|((1[0-7]\\d)|([1-9]?\\d))(\\.\\d+)?)$`

func IsDNSName(str string) bool

是否是dns 名称

`^([a-zA-Z0-9_]{1}[a-zA-Z0-9_-]{0,62}){1}(\.[a-zA-Z0-9_]{1}[a-zA-Z0-9_-]{0,62})*[\._]?$`

func IsIPv4(str string) bool

是否是ipv4

`([1-9]\d?|1\d\d|2[01]\d|22[0-3])(\.(1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.([0-9]\d?|1\d\d|2[0-4]\d|25[0-4]))`

func IsWindowsPath(str string) bool

是否是windos路径

`^[a-zA-Z]:\\(?:[^\\/:*?"<>|\r\n]+\\)*[^\\/:*?"<>|\r\n]*$`

func IsUnixPath(str string) bool

是否是unix路径

`^(/[^/\x00]*)+/?$`

func RegTime(str string, property …string) []string

提取时间

`(?i)\d{1,2}:\d{2} ?(?:[ap]\.?m\.?)?|\d[ap]\.?m\.?`

func RegLink(str string, property …string) []string

提取链接

`(?:(?:https?:\/\/)?(?:[a-z0-9.\-]+|www|[a-z0-9.\-])[.](?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\))+(?:\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\)|[^\s!()\[\]{};:\'".,<>?]))`

func RegEmail(str string, property …string) []string

提取邮件

`(?i)([A-Za-z0-9!#$%&'*+\/=?^_{|.}~-]+@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)`

func RegIPv4(str string, property …string) []string

提取ipv4

`(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)`

func RegIPv6(str string, property …string) []string

提取ipv6

`(?:(?:(?:[0-9A-Fa-f]{1,4}:){7}(?:[0-9A-Fa-f]{1,4}|:))|(?:(?:[0-9A-Fa-f]{1,4}:){6}(?::[0-9A-Fa-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9A-Fa-f]{1,4}:){5}(?:(?:(?::[0-9A-Fa-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9A-Fa-f]{1,4}:){4}(?:(?:(?::[0-9A-Fa-f]{1,4}){1,3})|(?:(?::[0-9A-Fa-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9A-Fa-f]{1,4}:){3}(?:(?:(?::[0-9A-Fa-f]{1,4}){1,4})|(?:(?::[0-9A-Fa-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9A-Fa-f]{1,4}:){2}(?:(?:(?::[0-9A-Fa-f]{1,4}){1,5})|(?:(?::[0-9A-Fa-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9A-Fa-f]{1,4}:){1}(?:(?:(?::[0-9A-Fa-f]{1,4}){1,6})|(?:(?::[0-9A-Fa-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9A-Fa-f]{1,4}){1,7})|(?:(?::[0-9A-Fa-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*`

func RegIP(str string, property …string) []string

提取ip

`(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)|(?:(?:(?:[0-9A-Fa-f]{1,4}:){7}(?:[0-9A-Fa-f]{1,4}|:))|(?:(?:[0-9A-Fa-f]{1,4}:){6}(?::[0-9A-Fa-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9A-Fa-f]{1,4}:){5}(?:(?:(?::[0-9A-Fa-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(?:(?:[0-9A-Fa-f]{1,4}:){4}(?:(?:(?::[0-9A-Fa-f]{1,4}){1,3})|(?:(?::[0-9A-Fa-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9A-Fa-f]{1,4}:){3}(?:(?:(?::[0-9A-Fa-f]{1,4}){1,4})|(?:(?::[0-9A-Fa-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9A-Fa-f]{1,4}:){2}(?:(?:(?::[0-9A-Fa-f]{1,4}){1,5})|(?:(?::[0-9A-Fa-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?:(?:[0-9A-Fa-f]{1,4}:){1}(?:(?:(?::[0-9A-Fa-f]{1,4}){1,6})|(?:(?::[0-9A-Fa-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(?::(?:(?:(?::[0-9A-Fa-f]{1,4}){1,7})|(?:(?::[0-9A-Fa-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(?:%.+)?\s*`

func RegMD5Hex(str string, property …string) []string

提取md5

`[0-9a-fA-F]{32}`

func RegSHA1Hex(str string, property …string) []string

提取sha1

`[0-9a-fA-F]{40}`

func RegSHA256Hex(str string, property …string) []string

提取sha256

`[0-9a-fA-F]{64}`

func RegGUID(str string, property …string) []string

提取guid

`[0-9a-fA-F]{8}-?[a-fA-F0-9]{4}-?[a-fA-F0-9]{4}-?[a-fA-F0-9]{4}-?[a-fA-F0-9]{12}`

func RegMACAddress(str string, property …string) []string

提取MACAddress

`(([a-fA-F0-9]{2}[:-]){5}([a-fA-F0-9]{2}))`

func RegEmail2(str string, property …string) []string

提取邮件

"^(((([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])+(\\.([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])([a-zA-Z]|\\d|-|\\.|_|~|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])*([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])))\\.)+(([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])([a-zA-Z]|\\d|-|_|~|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])*([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])))\\.?$"

func RegUUID3(str string, property …string) []string

提取uuid

"^[0-9a-f]{8}-[0-9a-f]{4}-3[0-9a-f]{3}-[0-9a-f]{4}-[0-9a-f]{12}$"

func RegUUID4(str string, property …string) []string

提取uuid

"^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"

func RegUUID5(str string, property …string) []string

提取uuid

"^[0-9a-f]{8}-[0-9a-f]{4}-5[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"

func RegUUID(str string, property …string) []string

提取uuid

"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"

func RegInt(str string, property …string) []string

提取整形

"^(?:[-+]?(?:0|[1-9][0-9]*))$"

func RegFloat(str string, property …string) []string

提取浮点型

"^(?:[-+]?(?:[0-9]+))?(?:\\.[0-9]*)?(?:[eE][\\+\\-]?(?:[0-9]+))?$"

func RegRGBColor(str string, property …string) []string

提取RGB值

"^rgb\\(\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*\\)$"

func RegFullWidth(str string, property …string) []string

提取全角字符

"[^\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]"

func RegHalfWidth(str string, property …string) []string

提取半角字符

"[\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]"

func RegBase64(str string, property …string) []string

提取base64字符串

"^(?:[A-Za-z0-9+\\/]{4})*(?:[A-Za-z0-9+\\/]{2}==|[A-Za-z0-9+\\/]{3}=|[A-Za-z0-9+\\/]{4})$"

func RegLatitude(str string, property …string) []string

提取纬度

"^[-+]?([1-8]?\\d(\\.\\d+)?|90(\\.0+)?)$"

func RegLongitude(str string, property …string) []string

提取经度

"^[-+]?(180(\\.0+)?|((1[0-7]\\d)|([1-9]?\\d))(\\.\\d+)?)$"

func RegDNSName(str string, property …string) []string

提取dns

`^([a-zA-Z0-9_]{1}[a-zA-Z0-9_-]{0,62}){1}(\.[a-zA-Z0-9_]{1}[a-zA-Z0-9_-]{0,62})*[\._]?$`

func RegFullURL(str string, property …string) []string

提取url

`^(?:ftp|tcp|udp|wss?|https?):\/\/[\w\.\/#=jQuery1124048736386703191026_1648193326187&]+$`

func RegURLSchema(str string, property …string) []string

提取url schema

`((ftp|tcp|udp|wss?|https?):\/\/)`

func RegURLUsername(str string, property …string) []string

提取url username

`(\S+(:\S*)?@)`

func RegURLPath(str string, property …string) []string

提取url path

`((\/|\?|#)[^\s]*)`

func RegURLPort(str string, property …string) []string

提取url port

`(:(\d{1,5}))`

func RegURLIP(str string, property …string) []string

提取 url ip

`([1-9]\d?|1\d\d|2[01]\d|22[0-3])(\.(1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.([0-9]\d?|1\d\d|2[0-4]\d|25[0-4]))`

func RegURLSubdomain(str string, property …string) []string

提取 url sub domain

`((www\.)|([a-zA-Z0-9]+([-_\.]?[a-zA-Z0-9])*[a-zA-Z0-9]\.[a-zA-Z0-9]+))`

func RegWinPath(str string, property …string) []string

提取 windows路径

`^[a-zA-Z]:\\(?:[^\\/:*?"<>|\r\n]+\\)*[^\\/:*?"<>|\r\n]*$`

func RegUnixPath(str string, property …string) []string

提取 unix路径

`^(/[^/\x00]*)+/?$`

5.2 Html提取

func GetPointHTML(htmlStr, label, attr, val string) ([]string, error)

获取指定位置的HTML, 用标签, 标签属性, 属性值来定位

    date := "2022-07-05"caseUrl := "http://futures.100ppi.com/qhb/day-%s.html"ctx, _ := gt.Get(fmt.Sprintf(caseUrl, date))//log.Println(ctx.Html)// 数据提取datas, _ := gt.GetPointHTML(ctx.Html, "div", "id", "domestic")

func GetPointIDHTML(htmlStr, label, val string) ([]string, error)

获取指定标签id属性的html


func GetPointClassHTML(htmlStr, label, val string) ([]string, error)

获取指定标签class属性的html


5.3 Json提取

func JsonFind(jsonStr, find string) (interface{}, error)

JsonFind 按路径寻找指定json值

用法参考  ./_examples/json/main.go
@find : 寻找路径,与目录的url类似, 下面是一个例子:
json:  {a:[{b:1},{b:2}]}
find=/a/[0]  =>   {b:1}
find=a/[0]/b  =>   1

实例:

txt := `{"reason":"查询成功!","result":{"city":"苏州","realtime":{"temperature":"17","humidity":"69","info":"阴","wid":"02","direct":"东风","power":"2级","aqi":"30"},"future":[{"date":"2021-10-25","temperature":"12\/21℃","weather":"多云","wid":{"day":"01","night":"01"},"direct":"东风"},{"date":"2021-10-26","temperature":"13\/21℃","weather":"多云","wid":{"day":"01","night":"01"},"direct":"东风转东北风"},{"date":"2021-10-27","temperature":"13\/22℃","weather":"多云","wid":{"day":"01","night":"01"},"direct":"东北风"},{"date":"2021-10-28","temperature":"13\/21℃","weather":"多云转晴","wid":{"day":"01","night":"00"},"direct":"东北风"},{"date":"2021-10-29","temperature":"14\/21℃","weather":"多云转小雨","wid":{"day":"01","night":"07"},"direct":"东北风"}]},"error_code":0
}`jx1 := "/result/future/[0]/date"jx2 := "/result/future/[0]"jx3 := "/result/future"log.Println(gt.JsonFind(txt, jx1))log.Println(gt.JsonFind2Json(txt, jx2))log.Println(gt.JsonFind2Json(txt, jx3))log.Println(gt.JsonFind2Map(txt, jx2))log.Println(gt.JsonFind2Arr(txt, jx3))

func JsonFind2Json(jsonStr, find string) (string, error)

寻找json,输出 json格式字符串


func JsonFind2Map(jsonStr, find string) (map[string]interface{}, error)

寻找json,输出 map[string]interface{}


func JsonFind2Arr(jsonStr, find string) ([]interface{}, error)

JsonFind2Arr 寻找json,输出 []interface{}


func IsJson(str string) bool

IsJson 是否是json格式


六、爬虫篇

现在各个数据源日益月薪,变化非常快,爬虫程序无法做到固定,对端源一变化爬虫程序就要跟着变,有时候与其在原有基础上迭代还不如重新编写。重新编写就会出现一个问题,这个问题就是时间成本增加,为了降低时间成本所以我编写并开源了gathertool。
gathertool作为一款轻量级爬虫框架,其解决核心问题是提高编写爬虫程序效率降低时间成本。gathertool主要使用请求部分+提取部分+数据处理部分+存储部分作为爬虫框架的方法集,使用者可以根据具体业务进行灵活使用,下面先通过一个例子来介绍:


6.1 例子

已抓取 http://ip.bczs.net/country/CN ,将页面内容保存到数据为例

import gt "github.com/mangenotwork/gathertool"
func main(){db,err := gt.NewMysql("192.168.0.192", 3306,  "root", "root123", "test")  // 连接数据库if err != nil { panic(err) }ctx, err := gt.Get("http://ip.bczs.net/country/CN") // 请求数据if err != nil { panic(err) }for _, tbody := range gt.RegHtmlTbody(ctx.Html) { // 提取数据并保存for _, tr := range gt.RegHtmlTr(tbody) {td := gt.RegHtmlTdTxt(tr)if len(td) < 3 {gt.Error("异常数据 : ", td)continue}err := db.InsertAt("ip", map[string]interface{}{"start": td[0], "end": td[1], "num": td[2]})if err != nil { panic(err) }}}
}

抓取结果如图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GMPo0aAA-1680245435065)(http://mange1.oss-cn-beijing.aliyuncs.com/test/31d42875c8c6a41b6ee8f04d87f0deb5.png “”)]

从上面例子就可以看到使用gathertool 18行代码就能完成请求,提取,存储到数据库的全过程; 编码时间只有1分钟。

实例代码位置: ip地址信息抓取


6.2 并发抓取

gathertool的请求对象是独立的实例,这样做的目的也是为了并发请求时都是独立的,不使用重复对象; gathertool的并发抓取采用本地队列+任务对象;下面将具体介绍:

队列方法

type TodoQueue interface {Add(task *Task) error  //向队列中添加元素Poll()   *Task  //移除队列中最前面的元素Clear()  bool   //清空队列Size()  int     //获取队列的元素个数IsEmpty() bool  //判断队列是否是空Print() // 打印
}

队列

type Queue struct {mux *sync.Mutexlist []*Task
}

func NewQueue() TodoQueue

新建一个队列


func (q *Queue) Add(task *Task) error

向队列中添加元素


func (q *Queue) Poll() *Task

移除队列中最前面的额元素


func (q *Queue) Clear() bool

清空队列


func (q *Queue) Size() int

队列长度


func (q *Queue) IsEmpty() bool

队列是否空


func (q *Queue) Print()

队列打印


type UploadQueue struct

下载队列


func NewUploadQueue() TodoQueue

新建一个下载队列


func (q *UploadQueue) Add(task *Task) error

向队列中添加元素


func (q *UploadQueue) Poll() *Task

移除队列中最前面的额元素


任务对象

type Task struct {Url stringJsonParam stringHeaderMap *http.HeaderData map[string]interface{} // 上下文传递的数据Urls []*ReqUrl // 多步骤使用Type string // "", "upload", "do"SavePath stringSaveDir stringFileName stringonce *sync.Once
}

func (task Task) GetDataStr(key string) string

获取上下文数据


func (task Task) AddData(key string, value interface{}) Task

添加上下问数据


func CrawlerTask(url, jsonParam string, vs …interface{}) *Task

爬虫任务


func StartJob(jobNumber int, queue TodoQueue,f func(task *Task))

启动并发


func StartJobGet(jobNumber int, queue TodoQueue, vs …interface{})

并发执行Get,直到队列任务为空; jobNumber 并发数,queue 全局队列,


func StartJobPost(jobNumber int, queue TodoQueue, vs …interface{})

开始运行并发Post,直到队列任务为空; jobNumber 并发数,queue 全局队列,


func CPUMax()

启用多核执行


6.3 并发抓取列子

已抓取 http://ip.bczs.net/country/CN ,并发抓取每个ip的二级页面数据并存入数据库

var (// 全局声明抓取任务队列queue = gt.NewQueue()// 全局声明数据库客户端对象host   = "192.168.0.192"port    = 3306user      = "root"password  = "root123"dbname = "test"db,_ = gt.NewMysql(host, port, user, password, dbname)
)func main(){// 1.在页面 http://ip.bczs.net/country/CN 获取所有ip_,_=gt.Get("http://ip.bczs.net/country/CN",gt.SucceedFunc(IPListSucceed))// 2. 并发抓取详情数据, 20个并发gt.StartJobGet(20,queue,gt.SucceedFunc(GetIPSucceed),//请求成功后执行的方法gt.RetryFunc(GetIPRetry),//遇到 502,403 等状态码重试前执行的方法,一般为添加休眠时间或更换代理gt.FailedFunc(GetIPFailed),//请求失败后执行的方法)
}// 请求成功执行
func IPListSucceed(ctx *gt.Context){for _, tbody := range gt.RegHtmlTbody(ctx.RespBodyString()) {for _, tr := range gt.RegHtmlTr(tbody) {td := gt.RegHtmlTdTxt(tr)log.Println(td)if len(td) < 3 {gt.Error("异常数据 : ", td)continue}startIp := gt.Any2String(gt.RegHtmlATxt(td[0])[0])// IP起始endIP := td[1]// 结束number := td[2]// 数量// 创建队列 抓取详情信息queue.Add(&gt.Task{Url: "http://ip.bczs.net/"+startIp,Data: map[string]interface{}{"start_ip":startIp,"end_ip":endIP,"number":number,},})}}
}// 获取详情信息成功的处理
func GetIPSucceed(cxt *gt.Context){// 使用goquery库提取数据dom,err := goquery.NewDocumentFromReader(strings.NewReader(cxt.RespBodyString()))if err != nil{log.Println(err)return}result, err := dom.Find("div[id=result] .well").Html()if err != nil{log.Println(err)}// 固定顺序mapgd := gt.NewGDMap().Add("start_ip", cxt.Task.GetDataStr("start_ip"))gd.Add("end_ip", cxt.Task.GetDataStr("end_ip"))gd.Add("number", cxt.Task.GetDataStr("number")).Add("result", result)// 保存抓取数据err = db.InsertAtGd("ip_result", gd)if err != nil {panic(err)}
}// 获取详情信息重试的处理
func GetIPRetry(c *gt.Context){//更换代理//c.SetProxy(uri)// orc.Client = &http.Client{// 设置代理//Transport: &http.Transport{//	Proxy: http.ProxyURL(uri),//},Timeout: 5*time.Second,}log.Println("休息1s")time.Sleep(1*time.Second)
}// 获取详情信息失败执行返还给队列
func GetIPFailed(c *gt.Context){queue.Add(c.Task)//请求失败归还到队列
}

抓取结果如图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7IeUiFix-1680245435068)(http://mange1.oss-cn-beijing.aliyuncs.com/test/effd5a6d3e8b26ee994f3c4e76efebed.png “”)]


6.4 更多实例子 见

  • 阳光高考招生章程抓取
  • ip地址信息抓取
  • 文件下载
  • 无登录微博抓取
  • 百度题库抓取

七、Mysql存储篇

gathertool 基于 “github.com/go-sql-driver/mysql” + “database/sql” 封装了数据操作的方法;

7.1 方法

var MysqlDB

全局mysql客户端对象


type Mysql struct

mysql客户端结构体


func NewMysqlDB(host string, port int, user, password, database string) (err error)

初始化mysql客户端对象并进行连接

gt.NewMysqlDB(host2, port, user2, password2, db1)
gt.MysqlDB.Insert("table2", data1)

func NewMysql(host string, port int, user, password, database string) (*Mysql, error)

创建一个mysql客户端对象


func GetMysqlDBConn() (*Mysql,error)

获取mysql 连接, 前置需要初始化 NewMysqlDB


func (m *Mysql) CloseLog()

关闭终端日志打印


func (m *Mysql) SetMaxOpenConn(number int)

设置最大连接数


func (m *Mysql) SetMaxIdleConn(number int)

最大等待连接中的数量


func (m *Mysql) Conn() (err error)

连接mysql


func (m *Mysql) IsHaveTable(table string) bool

表是否存在


type TableInfo struct

表信息


func (m *Mysql) Describe(table string) ( *tableDescribe, error)

查看表结构


func (m *Mysql) Select(sql string) ([]map[string]string, error)

查询语句 返回 map


func (m *Mysql) NewTable(table string, fields map[string]string) error

创建表; 字段顺序不固定;
fields 字段:类型; name:varchar(10);


func (m *Mysql) NewTableGd(table string, fields *gDMap) error

创建新的固定map顺序为字段的表(见下文固定map)


func (m *Mysql) Insert(table string, fieldData map[string]interface{}) error

新增数据; table是存在的


func (m *Mysql) InsertAt(table string, fieldData map[string]interface{}) error

新增数据; 如果没有表则先创建表; 字段顺序不是固定的;


func (m *Mysql) InsertAtGd(table string, fieldData *gDMap) error

新增数据; 如果没有表则先创建表; 字段顺序是固定的;


func (m *Mysql) InsertAtJson(table, jsonStr string) error

json字符串存入数据库; 如果没有表则先创建表; 字段顺序不是固定的;


func (m *Mysql) Update(sql string) error

Update


func (m *Mysql) Exec(sql string) error

Exec


func (m *Mysql) Query(sql string) ([]map[string]string, error)

Query


func (m *Mysql) Delete(sql string) error

Delete


func (m *Mysql) ToVarChar(data interface{}) string

写入mysql 的字符类型


func (m *Mysql) DeleteTable(tableName string) error

删除表


func (m *Mysql) HasTable(tableName string) bool

判断表是否存


func (m *Mysql) ToXls(sql, outPath string)

查询数据导出到excel

db.ToXls("selecr * from tabe1", "table1.xls")

7.2 实例

// =========================== 数据库初始化
var (host2   = "192.168.0.2"host3   = "192.168.0.3"port    = 3306user2      = "root"password2  = "root123"user3      = "root3"password3  = "root333"db1  = "db1"DB1,_ = gt.NewMysql(host2, port, user2, password2, db1)db2  = "db2"DB2,_ = gt.NewMysql(host2, port, user2, password2, db2)db3  = "db3"DB3,_ = gt.NewMysql(host3, port, user3, password3, db3))// 不存在表table1 存入json key为字段,value为值, 非固定顺序字段
jsonStr := `{"a":"a","b":"b"}`
db1.InsertAtJson("table1", jsonStr)// 不存在表table2 存入非固定顺序字段的数据(map是无序的)
data1 := map[string]interface{}{"a":"a", "b":1}
db2.InsertAt("table2", data1)// 不存在表table3 存入固定顺序字段的数据  (a,b)
gd := gt.NewGDMap().Add("a", 1).Add("b", 2)
db3.InsertAt("table3", gd)// 存在表table2 存入数据
db2.Insert("table2", data1)
......

八、接口测试篇

gathertool可以用于接口测试和压力测试,极大的提升了测试编码效率。

type StressUrl struct

压力测试一个url

type StressUrl struct {Url stringMethod stringSum int64Total intTQueue TodoQueue// 请求时间累加sumReqTime int64// 测试结果avgReqTime time.Duration// 接口传入的jsonJsonData string// 接口传入类型ContentType stringstateCodeList []*stateCodeDatastateCodeListMux *sync.Mutex
}

func NewTestUrl(url, method string, sum int64, total int) *StressUrl

实例化一个新的url压测


func (s *StressUrl) SetJson(str string)

设置json数据


func (s *StressUrl) Run(vs …interface{})

运行压测


例子:

import (gt "github.com/mangenotwork/gathertool""log"
)func main() {gt.CPUMax()// 普通 GET api压测url := "http://192.168.0.9:8002/v1/health"// 请求10000次 并发数 1000test := gt.NewTestUrl(url,"Get",10000,1000)test.Run()test.Run(gt.SucceedFunc(func(ctx *gt.Context){log.Println(ctx.JobNumber, "测试完成!!", ctx.Ms)}))
}

结果:

2022-03-28 16:17:09 |Info  | 执行次数 : 10000
2022-03-28 16:17:09 |Info  | 状态码分布: map[200:10000]
2022-03-28 16:17:09 |Info  | 平均用时: 35.555388957699996ms
2022-03-28 16:17:09 |Info  | 最高用时: 235.268968ms
2022-03-28 16:17:09 |Info  | 最低用时: 0.123935ms
2022-03-28 16:17:09 |Info  | 执行完成!!!

其他例子,碎片话代码,仅供参考:

/// 设置 GET Header 的压测url2 := "http://192.168.0.9:18084/static_service/v1/auth/video/page"//url2 := "http://192.168.0.9:18084/static_service/v1/auth/quality_article/list"//token := &http.Header{}//token.Add("token", tokenStr)//token.Add("source", "2")//test2 := gt.NewTestUrl(url2,"Get",10000,1000)//test2.Run(token) Post//url4 := "http://ggzyjy.sc.gov.cn/WebBuilder/frontAppAction.action?cmd=addPageView"//test4 := gt.NewTestUrl(url4,"Post",100,10)//test4.SetJson(`{//			"viewGuid":"cms_002",//			"siteGuid":"7eb5f7f1-9041-43ad-8e13-8fcb82ea831a"//			}`)//test4.Run(gt.SucceedFunc(func(c *gt.Context) {//	log.Println(string(c.RespBody))//	log.Println(c.Resp.Cookies())//}))//点赞//npplike := "http://192.168.0.9:8025/v2/like/add"//npplike()//caseurl := "https://www.jy863.com:18443/"//caseurl := "https://www.uks678.com:10442/api/site/gdnotice/list"//npptest1 := gt.NewTestUrl(caseurl,"Get",10000,1000)//hd := &http.Header{}//hd.Add("requested-device", "APP")//hd.Add("requested-language", "CN")//hd.Add("requested-site", "www.uks678.com:10442")//npptest1.Run(hd)caseUrl := `http://192.168.0.9:8025/v2/topic/create`gt.NewMysqlDB(host, port, user, password, database)gt.MysqlDB.CloseLog()conn,err := gt.GetMysqlDBConn()if err != nil {log.Panic("数据库初始化失败")}allUid, _ := conn.Select("select uid from tbl_user_ext limit 100,10000")for _,v := range allUid{token := GetToken(v["uid"])h := &http.Header{}h.Add("token", token)data := `
{"uid": `+v["uid"]+`,"qi": 2021315,"fid": 1,"source": 1,"content": "我爱牛票票"
}`ctx,err := gt.PostJson(caseUrl, data, h)log.Println(ctx.RespBodyString(), err)}// 评论
func nppComment() {caseUrl := "http://192.168.0.9:8025/v1/comment/add"gt.NewMysqlDB(host, port, user, password, database)gt.MysqlDB.CloseLog()conn,err := gt.GetMysqlDBConn()if err != nil {log.Panic("数据库初始化失败")}allUid, _ := conn.Select("select uid from tbl_user_ext")allTid, _ := conn.Select("select tid from tbl_topic")i:=0for _,v := range allUid{for _, t := range allTid {token := GetToken(v["uid"])h := &http.Header{}h.Add("token", token)i++if i%3 == 0 {continue}data := `
{"content":"我们都爱牛票票","tid": `+t["tid"]+`,"cmtid":0,"uid": `+v["uid"]+`,"source":1
}`gt.PostJson(caseUrl, data, h)}}
}

九、加密解密篇

加密解码相关封装方法

const (CBC = "CBC"ECB = "ECB"CFB = "CFB"CTR = "CTR"
)

type AES interface

type AES interface {Encrypt(str, key []byte) ([]byte, error)Decrypt(str, key []byte) ([]byte, error)
}

type DES interface

type DES interface {Encrypt(str, key []byte) ([]byte, error)Decrypt(str, key []byte) ([]byte, error)
}

func NewAES(typeName string, arg …[]byte) AES

use NewAES(“cbc”)
typeName:

  • “cbc”, “Cbc”,“CBC”
  • “ecb”, “Ecb”, ECB
  • “cfb”, “Cfb”, CFB
  • “ctr”, “Ctr”, CTR

func NewDES(typeName string, arg …[]byte) DES

use NewAES(“cbc”)
typeName:

  • “cbc”, “Cbc”,“CBC”
  • “ecb”, “Ecb”, ECB
  • “cfb”, “Cfb”, CFB
  • “ctr”, “Ctr”, CTR

func (cbc *cbcObj) Encrypt(str, key []byte) ([]byte, error)

AES CBC Encrypt


func (cbc *cbcObj) Decrypt(str, key []byte) ([]byte, error)

AES CBC Decrypt


func (ecb *ecbObj) Encrypt(str, key []byte) ([]byte, error)

AES ECB Encrypt


func (ecb *ecbObj) Decrypt(str, key []byte) ([]byte, error)

AES ECB Decrypt


func (cfb *cfbObj) Encrypt(str, key []byte) ([]byte, error)

AES CFB Encrypt


func (cfb *cfbObj) Decrypt(str, key []byte) ([]byte, error)

AES CFB Decrypt


func (ctr *ctrObj) Encrypt(str, key []byte) ([]byte, error)

AES CTR Encrypt


func (ctr *ctrObj) Decrypt(str, key []byte) ([]byte, error)

AES CTR Decrypt


func HmacMD5(str, key string) string

HmacMD5


func HmacSHA1(str, key string) string

HmacSHA1


func HmacSHA256(str, key string) string

HmacSHA256


func HmacSHA512(str, key string) string

HmacSHA512


func PBKDF2(str, salt []byte, iterations, keySize int) ([]byte)

PBKDF2


func JwtEncrypt(data map[string]interface{}, secret, method string) (string, error)

Jwt Encrypt


func JwtEncrypt256(data map[string]interface{}, secret string) (string, error)

Jwt Encrypt 256


func JwtEncrypt384(data map[string]interface{}, secret string) (string, error)

Jwt Encrypt 384


func JwtEncrypt512(data map[string]interface{}, secret string) (string, error)

Jwt Encrypt 512


func JwtDecrypt(tokenString, secret string) (data map[string]interface{}, err error)

Jwt Decrypt


十、Redis篇

gathertool的redis方法是基于"github.com/garyburd/redigo/redis"再次封装的,再加上了ssh连接通道,实现了对云端redis的连接; 主要常用如:快速删除大量指定key等。

10.1 连接

type Rds struct

type Rds struct {SSHUser stringSSHPassword stringSSHAddr stringRedisHost stringRedisPost stringRedisPassword string// redis DBRedisDB int// 单个连接Conn redis.Conn//	最大闲置数,用于redis连接池RedisMaxIdle int//	最大连接数RedisMaxActive int//	单条连接TimeoutRedisIdleTimeoutSec int// 连接池Pool *redis.Pool
}

func (r *Rds) RedisConn() (err error)

redis连接


func (r *Rds) RedisPool() error

连接池连接, 返回redis连接池 *redis.Pool.Get() 获取redis连接


func (r *Rds) GetConn() redis.Conn

获取连接


func (r *Rds) SelectDB(dbNumber int) error

切换db


func NewSSHInfo( addr, user, password string) *SSHConnInfo

连接ssh


func NewRedis(host, port, password string, db int, vs …interface{}) (*Rds)

实例化redis对象


func NewRedisPool(host, port, password string, db, maxIdle, maxActive, idleTimeoutSec int, vs …interface{}) (*Rds)

实例化redis连接池对象


func RedisDELKeys(rds *Rds, keys string, jobNumber int)

并发删除key;keys 模糊key; jobNumber 并发数;

rds := gt.NewRedisPool(redis_host, redis_port, redis_password, dbnumber, 5, 10, 10, gt.NewSSHInfo(ssh_addr, ssh_user, ssh_password))
gt.RedisDELKeys(rds, "user:*", 500)

func (r *Rds) MqProducer(mqName string, data interface{}) error

Redis消息队列生产方


func (r *Rds) MqConsumer(mqName string) (reply interface{}, err error)

Redis消息队列消费方


func (r *Rds) MqLen(mqName string) int64

Redis消息队列消息数量


func (r *Rds) ToString(reply interface{}, err error) (string, error)

Redis数据转为 string


func (r *Rds) ToInt(reply interface{}, err error) (int, error)

Redis数据转为 int


func (r *Rds) ToInt64(reply interface{}, err error) (int64, error)

Redis数据转为 int64


func (r *Rds) ToBool(reply interface{}, err error) (bool, error)

Redis数据转为 bool


func (r *Rds) ToBytes(reply interface{}, err error) ([]byte, error)

Redis数据转为 []byte


func (r *Rds) ToByteSlices(reply interface{}, err error) ([][]byte, error)

Redis数据转为 [][]byte


func (r *Rds) ToFloat64(reply interface{}, err error) (float64, error)

Redis数据转为 float64


func (r *Rds) ToFloat64s(reply interface{}, err error) ([]float64, error)

Redis数据转为 []float64


func (r *Rds) ToInt64Map(reply interface{}, err error) (map[string]int64, error)

Redis数据转为 map[string]int64


func (r *Rds) ToInt64s(reply interface{}, err error) ([]int64, error)

Redis数据转为 []int64


func (r *Rds) ToIntMap(reply interface{}, err error) (map[string]int, error)

Redis数据转为 map[string]int


func (r *Rds) ToInts(reply interface{}, err error) ([]int, error)

Redis数据转为 []int


func (r *Rds) ToStringMap(reply interface{}, err error) (map[string]string, error)

Redis数据转为 map[string]string


func (r *Rds) ToStrings(reply interface{}, err error) ([]string, error)

Redis数据转为 []string


10.2 keys

func (c *RedisClient) GetALLKeys(match string) (ksyList map[string]int)

GetALLKeys 获取所有的key


func (r *Rds) SearchKeys(match string) (ksyList map[string]int)

SearchKeys 搜索key


func (r *Rds) Type(key string) string

Type 获取key的类型


func (r *Rds) Ttl(key string) int64

Ttl 获取key的过期时间


func (r *Rds) DUMP(key string) bool

DUMP 检查给定 key 是否存在。


func (r *Rds) Rename(name, newName string) bool

Rename 修改key名称


func (r *Rds) Expire(key string, ttl int64) bool

Expire 更新key ttl


func (r *Rds) ExpireAt(key string, date int64) bool

ExpireAt 指定key多久过期 接收的是unix时间戳


func (r *Rds) DelKey(key string) bool

DelKey 删除key


10.3 string

func (r *Rds) Get(key string) (string, error)

Get GET 获取String value


func (r *Rds) Set(key string, value interface{}) error

Set SET 新建String


func (r *Rds) SetEx(key string, ttl int64, value interface{}) error

SetEx SETEX 新建String 含有时间


func (r *Rds) PSetEx(key string, ttl int64, value interface{}) error

PSetEx PSETEX key milliseconds value

这个命令和 SETEX 命令相似,但它以毫秒为单位设置 key 的生存时间,而不是像 SETEX 命令那样,以秒为单位。


func (r *Rds) SetNx(key string, value interface{}) error

SetNx key value

将 key 的值设为 value ,当且仅当 key 不存在。

若给定的 key 已经存在,则 SETNX 不做任何动作。


func (r *Rds) SetRange(key string, offset int64, value interface{}) error

SetRange SETRANGE key offset value

用 value 参数覆写(overwrite)给定 key 所储存的字符串值,从偏移量 offset 开始。

不存在的 key 当作空白字符串处理。


func (r *Rds) Append(key string, value interface{}) error

Append APPEND key value

如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾。

如果 key 不存在, APPEND 就简单地将给定 key 设为 value ,就像执行 SET key value 一样。


func (r *Rds) Decr(key string) (int64, error)

Decr key

将 key 中储存的数字值减一。

如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 DECR 操作。

如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。


func (r *Rds) DecrBy(key, decrement string) (int64, error)

DecrBy DECRBY key decrement

将 key 所储存的值减去减量 decrement 。


func (r *Rds) GetRange(key string, start, end int64) (string, error)

GetRange GETRANGE key start end

返回 key 中字符串值的子字符串,字符串的截取范围由 start 和 end 两个偏移量决定(包括 start 和 end 在内)。


func (r *Rds) GetSet(key string, value interface{}) (string, error)

GetSet GETSET key value

将给定 key 的值设为 value ,并返回 key 的旧值(old value)。

当 key 存在但不是字符串类型时,返回一个错误。


func (r *Rds) Incr(key string) (int64, error)

Incr INCR key

将 key 中储存的数字值增一。

如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作。

如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。


func (r *Rds) IncrBy(key, increment string) (int64, error)

IncrBy INCRBY key increment

将 key 所储存的值加上增量 increment 。


func (r *Rds) IncrByFloat(key, increment float64) (float64, error)

IncrByFloat INCRBYFLOAT key increment

为 key 中所储存的值加上浮点数增量 increment 。


func (r *Rds) MGet(key []interface{}) ([]string, error

MGet MGET key [key …]

返回所有(一个或多个)给定 key 的值。

如果给定的 key 里面,有某个 key 不存在,那么这个 key 返回特殊值 nil 。因此,该命令永不失败。


func (r *Rds) MSet(values []interface{}) error

MSet MSET key value [key value …]

同时设置一个或多个 key-value 对。

如果某个给定 key 已经存在,那么 MSET 会用新值覆盖原来的旧值,如果这不是你所希望的效果,

请考虑使用 MSETNX 命令:它只会在所有给定 key 都不存在的情况下进行设置操作。

MSET 是一个原子性(atomic)操作,所有给定 key 都会在同一时间内被设置,某些给定 key 被更新而另一些给定 key 没有改变的情况,不可能发生。


func (r *Rds) MSetNx(values []interface{}) error

MSetNx MSETNX key value [key value …]

同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。

即使只有一个给定 key 已存在, MSETNX 也会拒绝执行所有给定 key 的设置操作。

MSETNX 是原子性的,因此它可以用作设置多个不同 key 表示不同字段(field)的唯一性逻辑对象(unique logic object),

所有字段要么全被设置,要么全不被设置。


10.4 list

func (r *Rds) LRange(key string) ([]interface{}, error)

LRange LRANGE 获取List value


func (r *Rds) LRangeST(key string, start, stop int64) ([]interface{}, error)

LRangeST LRANGE key start stop

返回列表 key 中指定区间内的元素,区间以偏移量 start 和 stop 指定。


func (r *Rds) LPush(key string, values []interface{}) error

LPush LPUSH 新创建list 将一个或多个值 value 插入到列表 key 的表头


func (r *Rds) RPush(key string, values []interface{}) error

RPush RPUSH key value [value …]

将一个或多个值 value 插入到列表 key 的表尾(最右边)。

如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表尾:比如对一个空列表 mylist 执行

RPUSH mylist a b c ,得出的结果列表为 a b c ,等同于执行命令 RPUSH mylist a 、 RPUSH mylist b 、 RPUSH mylist c 。

新创建List 将一个或多个值 value 插入到列表 key 的表尾(最右边)。


func (r *Rds) LIndex(key string, index int64) (string, error)

LIndex LINDEX key index

返回列表 key 中,下标为 index 的元素。


func (r *Rds) LInsert(direction bool, key, pivot, value string) error

LInsert LINSERT key BEFORE|AFTER pivot value

将值 value 插入到列表 key 当中,位于值 pivot 之前或之后。

当 pivot 不存在于列表 key 时,不执行任何操作。

当 key 不存在时, key 被视为空列表,不执行任何操作。

如果 key 不是列表类型,返回一个错误。

direction : 方向 bool true:BEFORE(前) false: AFTER(后)


func (r *Rds) LLen(key string) (int64, error)

LLen LLEN key

返回列表 key 的长度。

如果 key 不存在,则 key 被解释为一个空列表,返回 0 .


func (r *Rds) ListLPOP(key string) (string, error)

ListLPOP LPOP key

移除并返回列表 key 的头元素。


func (r *Rds) LPusHx(key string, value interface{}) error

LPusHx LPUSHX key value

将值 value 插入到列表 key 的表头,当且仅当 key 存在并且是一个列表。

和 LPUSH 命令相反,当 key 不存在时, LPUSHX 命令什么也不做。


func (r *Rds) LRem(key string, count int64, value interface{}) error

LRem LREM key count value

根据参数 count 的值,移除列表中与参数 value 相等的元素。

count 的值可以是以下几种:

count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。

count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。

count = 0 : 移除表中所有与 value 相等的值。


func (r *Rds) LSet(key string, index int64, value interface{}) error

LSet LSET key index value

将列表 key 下标为 index 的元素的值设置为 value 。

当 index 参数超出范围,或对一个空列表( key 不存在)进行 LSET 时,返回一个错误。


func (r *Rds) LTrim(key string, start, stop int64) error

LTrim LTRIM key start stop

对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。

举个例子,执行命令 LTRIM list 0 2 ,表示只保留列表 list 的前三个元素,其余元素全部删除。


func (r *Rds) RPop(key string) (string, error)

RPop RPOP key

移除并返回列表 key 的尾元素。


func (r *Rds) RPopLPush(key, destination string) (string, error)

RPopLPush RPOPLPUSH source destination

命令 RPOPLPUSH 在一个原子时间内,执行以下两个动作:

将列表 source 中的最后一个元素(尾元素)弹出,并返回给客户端。

将 source 弹出的元素插入到列表 destination ,作为 destination 列表的的头元素。

举个例子,你有两个列表 source 和 destination , source 列表有元素 a, b, c , destination

列表有元素 x, y, z ,执行 RPOPLPUSH source destination 之后, source 列表包含元素 a, b ,

destination 列表包含元素 c, x, y, z ,并且元素 c 会被返回给客户端。

如果 source 不存在,值 nil 被返回,并且不执行其他动作。

如果 source 和 destination 相同,则列表中的表尾元素被移动到表头,并返回该元素,可以把这种特殊情况视作列表的旋转(rotation)操作。


func (r *Rds) RPushX(key string, value interface{}) error

RPushX RPUSHX key value

将值 value 插入到列表 key 的表尾,当且仅当 key 存在并且是一个列表。


10.5 hash

func (r *Rds) HGetAll(key string) (map[string]string, error)

HGetAll HGETALL 获取Hash value


func (r *Rds) HGetAllInt(key string) (map[string]int, error)

HGetAllInt HGETALL 获取Hash value


func (r *Rds) HGetAllInt64(key string) (map[string]int64, error)

HGetAllInt64 HGETALL 获取Hash value


func (r *Rds) HSet(key, field string, value interface{}) (int64, error)

HSet HSET 新建Hash 单个field

如果 key 不存在,一个新的哈希表被创建并进行 HSET 操作。

如果域 field 已经存在于哈希表中,旧值将被覆盖。


func (r *Rds) HMSet(key string, values map[interface{}]interface{}) error

HMSet HMSET 新建Hash 多个field

HMSET key field value [field value …]

同时将多个 field-value (域-值)对设置到哈希表 key 中。

此命令会覆盖哈希表中已存在的域。


func (r *Rds) HSetNx(key, field string, value interface{}) error

HSetNx HSETNX key field value

给hash追加field value

将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在。


func (r *Rds) HDel(key string, fields []string) error

HDel HDEL key field [field …] 删除哈希表

key 中的一个或多个指定域,不存在的域将被忽略。


func (r *Rds) HExIsTs(key, fields string) bool

HExIsTs HEXISTS key field 查看哈希表

key 中,给定域 field 是否存在。


func (r *Rds) HGet(key, fields string) (string, error)

HGet HGET key field 返回哈希表

key 中给定域 field 的值。


func (r *Rds) HIncrBy(key, field string, increment int64) (int64, error)

HIncrBy HINCRBY key field increment

为哈希表 key 中的域 field 的值加上增量 increment 。

增量也可以为负数,相当于对给定域进行减法操作。

如果 key 不存在,一个新的哈希表被创建并执行 HINCRBY 命令。

如果域 field 不存在,那么在执行命令前,域的值被初始化为 0


func (r *Rds) HIncrByFloat(key, field string, increment float64) (float64, error)

HIncrByFloat HINCRBYFLOAT key field increment

为哈希表 key 中的域 field 加上浮点数增量 increment 。

如果哈希表中没有域 field ,那么 HINCRBYFLOAT 会先将域 field 的值设为 0 ,然后再执行加法操作。

如果键 key 不存在,那么 HINCRBYFLOAT 会先创建一个哈希表,再创建域 field ,最后再执行加法操作。


func (r *Rds) HKeys(key string) ([]string, error)

HKeys HKEYS key 返回哈希表

key 中的所有域。


func (r *Rds) HLen(key string) (int64, error)

HLen HLEN key 返回哈希表

key 中域的数量。


func (r *Rds) HMGet(key string, fields []string) ([]string, error)

HMGet HMGET key field [field …]

返回哈希表 key 中,一个或多个给定域的值。

如果给定的域不存在于哈希表,那么返回一个 nil 值。


func (r *Rds) HVaLs(key string) ([]string, error)

HVaLs HVALS key

返回哈希表 key 中所有域的值。


10.6 set

func (r *Rds) SMemeRs(key string) ([]interface{}, error)

SMemeRs SMEMBERS key

返回集合 key 中的所有成员。

获取Set value 返回集合 key 中的所有成员。


func (r *Rds) SAdd(key string, values []interface{}) error

SAdd SADD 新创建Set 将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。


func (r *Rds) SCard(key string) error

SCard SCARD key

返回集合 key 的基数(集合中元素的数量)。


func (r *Rds) SDiff(keys []string) ([]interface{}, error)

SDiff SDIFF key [key …]

返回一个集合的全部成员,该集合是所有给定集合之间的差集。

不存在的 key 被视为空集。


func (r *Rds) SDiffStore(key string, keys []string) ([]interface{}, error)

SDiffStore SDIFFSTORE destination key [key …]

这个命令的作用和 SDIFF 类似,但它将结果保存到 destination 集合,而不是简单地返回结果集。

如果 destination 集合已经存在,则将其覆盖。

destination 可以是 key 本身。


func (r *Rds) SInter(keys []string) ([]interface{}, error)

SInter SINTER key [key …]

返回一个集合的全部成员,该集合是所有给定集合的交集。

不存在的 key 被视为空集。


func (r *Rds) SInterStore(key string, keys []string) ([]interface{}, error)

SInterStore SINTERSTORE destination key [key …]

这个命令类似于 SINTER 命令,但它将结果保存到 destination 集合,而不是简单地返回结果集。

如果 destination 集合已经存在,则将其覆盖。

destination 可以是 key 本身。


func (r *Rds) SIsMember(key string, value interface{}) (resBool bool, err error)

SIsMember SISMEMBER key member

判断 member 元素是否集合 key 的成员。

返回值:

如果 member 元素是集合的成员,返回 1 。

如果 member 元素不是集合的成员,或 key 不存在,返回 0 。


func (r *Rds) SMove(key, destination string, member interface{}) (resBool bool, err error)

SMove SMOVE source destination member

将 member 元素从 source 集合移动到 destination 集合。

SMOVE 是原子性操作。

如果 source 集合不存在或不包含指定的 member 元素,则 SMOVE 命令不执行任何操作,仅返回 0 。否则,

member 元素从 source 集合中被移除,并添加到 destination 集合中去。

当 destination 集合已经包含 member 元素时, SMOVE 命令只是简单地将 source 集合中的 member 元素删除。

当 source 或 destination 不是集合类型时,返回一个错误。

返回值: 成功移除,返回 1 。失败0


func (r *Rds) SPop(key string) (string, error)

SPop SPOP key

移除并返回集合中的一个随机元素。


func (r *Rds) SRandMember(key string, count int64) ([]interface{}, error)

SRandMember SRANDMEMBER key [count]

如果命令执行时,只提供了 key 参数,那么返回集合中的一个随机元素。

如果 count 为正数,且小于集合基数,那么命令返回一个包含 count 个元素的数组,数组中的元素各不相同。

如果 count 大于等于集合基数,那么返回整个集合。

如果 count 为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值。


func (r *Rds) SRem(key string, member []interface{}) error

SRem SREM key member [member …]

移除集合 key 中的一个或多个 member 元素,不存在的 member 元素会被忽略。


func (r *Rds) SUnion(keys []string) ([]interface{}, error)

SUnion SUNION key [key …]

返回一个集合的全部成员,该集合是所有给定集合的并集。


func (r *Rds) SUnionStore(key string, keys []string) ([]interface{}, error)

SUnionStore SUNIONSTORE destination key [key …]

这个命令类似于 SUNION 命令,但它将结果保存到 destination 集合,而不是简单地返回结果集。


10.7 zset

func (r *Rds) ZRange(key string) ([]interface{}, error)

ZRange ZRANGE 获取ZSet value 返回集合 有序集成员的列表。


func (r *Rds) ZRangeST(key string, start, stop int64) ([]interface{}, error)

ZRangeST ZRANGE key start stop [WITHSCORES]

返回有序集 key 中,指定区间内的成员。

其中成员的位置按 score 值递增(从小到大)来排序。


func (r *Rds) ZRevRange(key string, start, stop int64) ([]interface{}, error)

ZRevRange ZREVRANGE key start stop [WITHSCORES]

返回有序集 key 中,指定区间内的成员。

其中成员的位置按 score 值递减(从大到小)来排列。

具有相同 score 值的成员按字典序的逆序(reverse lexicographical order)排列。


func (r *Rds) ZAdd(key string, values []interface{}) error

ZAdd ZADD 新创建ZSet 将一个或多个 member 元素及其 score 值加入到有序集 key 当中。


func (r *Rds) ZCard(key string) (int64, error)

ZCard ZCARD key

返回有序集 key 的基数。


func (r *Rds) ZCount(key string, min, max int64) (int64, error)

ZCount ZCOUNT key min max

返回有序集 key 中, score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的成员的数量。


func (r *Rds) ZIncrBy(key, member string, increment int64) (string, error)

ZIncrBy ZINCRBY key increment member

为有序集 key 的成员 member 的 score 值加上增量 increment 。

可以通过传递一个负数值 increment ,让 score 减去相应的值,比如 ZINCRBY key -5 member ,就是让 member 的 score 值减去 5 。

当 key 不存在,或 member 不是 key 的成员时, ZINCRBY key increment member 等同于 ZADD key increment member 。


func (r *Rds) ZRangeByScore(key string, min, max, offset, count int64) ([]interface{}, error)

ZRangeByScore ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。

具有相同 score 值的成员按字典序(lexicographical order)来排列(该属性是有序集提供的,不需要额外的计算)。

可选的 LIMIT 参数指定返回结果的数量及区间(就像SQL中的 SELECT LIMIT offset, count ),注意当 offset 很大时,

定位 offset 的操作可能需要遍历整个有序集,此过程最坏复杂度为 O(N) 时间。

可选的 WITHSCORES 参数决定结果集是单单返回有序集的成员,还是将有序集成员及其 score 值一起返回。

区间及无限 min 和 max 可以是 -inf 和 +inf ,这样一来,你就可以在不知道有序集的最低和最高 score 值的情况下,使用 ZRANGEBYSCORE 这类命令。

默认情况下,区间的取值使用闭区间 (小于等于或大于等于),你也可以通过给参数前增加 ( 符号来使用可选的开区间 (小于或大于)。


func (r *Rds) ZRangeByScoreAll(key string) ([]interface{}, error)

ZRangeByScoreAll 获取所有


func (r *Rds) ZRevRangeByScore(key string, min, max, offset, count int64) ([]interface{}, error)

ZRevRangeByScore key max min [WITHSCORES] [LIMIT offset count]

返回有序集 key 中, score 值介于 max 和 min 之间(默认包括等于 max 或 min )的所有的成员。有序集成员按 score 值递减(从大到小)的次序排列。

具有相同 score 值的成员按字典序的逆序(reverse lexicographical order )排列。


func (r *Rds) ZRevRangeByScoreAll(key string) ([]interface{}, error)

ZRevRangeByScoreAll 获取所有


func (r *Rds) ZRank(key string, member interface{}) (int64, error)

ZRank ZRANK key member

返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递增(从小到大)顺序排列。

排名以 0 为底,也就是说, score 值最小的成员排名为 0 。


func (r *Rds) ZRem(key string, member []interface{}) error

ZRem ZREM key member [member …]

移除有序集 key 中的一个或多个成员,不存在的成员将被忽略。


func (r *Rds) ZRemRangeByRank(key string, start, stop int64) error

ZRemRangeByRank ZREMRANGEBYRANK key start stop

移除有序集 key 中,指定排名(rank)区间内的所有成员。

区间分别以下标参数 start 和 stop 指出,包含 start 和 stop 在内。


func (r *Rds) ZRemRangeByScore(key string, min, max int64) error

ZRemRangeByScore ZREMRANGEBYSCORE key min max

移除有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。


func (r *Rds) ZRevRank(key string, member interface{}) (int64, error)

ZRevRank ZREVRANK key member

返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递减(从大到小)排序。

排名以 0 为底,也就是说, score 值最大的成员排名为 0 。

使用 ZRANK 命令可以获得成员按 score 值递增(从小到大)排列的排名。


func (r *Rds) ZScore(key string, member interface{}) (string, error)

ZScore ZSCORE key member

返回有序集 key 中,成员 member 的 score


十一、消息队列

11.1 接口

// MQer 消息队列接口
type MQer interface {Producer(topic string, data []byte)Consumer(topic string) []byte
}

11.2 nsq

func NewNsq(server string, port …int) MQer

NewNsq port 依次是 ProducerPort, ConsumerPort


func (m *MQNsqService) Producer(topic string, data []byte)

Producer 生产者


func (m *MQNsqService) Consumer(topic string) []byte

Consumer 消费者


实例

func NsqProducer() {mq := gt.NewNsq("127.0.0.1")topic := "test"data := []byte("data")mq.Producer(topic, data)
}func NsqConsumer() {topic := "test"mq := gt.NewNsq("127.0.0.1")for {data := mq.Consumer(topic)gt.Info(string(data))}}

11.3 RabbitMq

func NewRabbit(amqpUrl string) MQer


func (m *MQNsqService) Producer(topic string, data []byte)

Producer 生产者


func (m *MQNsqService) Consumer(topic string) []byte

Consumer 消费者


实例

func RabbitProducer() {mq := gt.NewRabbit("amqp://admin:123456@127.0.0.1:5672")topic := "test"data := []byte("data")mq.Producer(topic, data)
}func RabbitConsumer() {topic := "test"mq := gt.NewRabbit("amqp://admin:123456@127.0.0.1:5672")data := mq.Consumer(topic)gt.Info(string(data))
}

11.4 KafKa

func NewKafka(server []string) MQer


func (m *MQNsqService) Producer(topic string, data []byte)

Producer 生产者


func (m *MQNsqService) Consumer(topic string) []byte

Consumer 消费者


实例

func KafkaProducer() {mq := gt.NewKafka([]string{"192.168.4.12:9092"})topic := "test"data := []byte("data")mq.Producer(topic, data)
}func KafkaConsumer() {topic := "test"mq := gt.NewKafka([]string{"192.168.4.12:9092"})data := mq.Consumer(topic)gt.Info(string(data))
}

11.5 redis

func (r *Rds) MqProducer(mqName string, data interface{}) error

MqProducer Redis消息队列生产方


func (r *Rds) MqConsumer(mqName string) (reply interface{}, err error)

MqConsumer Redis消息队列消费方


func (r *Rds) MqLen(mqName string) int64

MqLen Redis消息队列消息数量


十二、Mongo篇

gathertool的mongo方法是基于”go.mongodb.org/mongo-driver”再次封装

type Mongo struct

type Mongo struct {User stringPassword stringHost stringPort stringConn *mongo.ClientDatabase *mongo.DatabaseCollection *mongo.CollectionMaxPoolSize intTimeOut time.Duration
}

func NewMongo(user, password, host, port string) (*Mongo, error)

实例化mongo对象


func (m *Mongo) GetConn() (err error)

建立mongodb 连接


func (m *Mongo) GetDB(dbname string)

连接mongodb 的db


func (m *Mongo) GetCollection(dbname, name string)

连接mongodb 的db的集合


func (m *Mongo) Insert(document interface{}) error

插入数据


TODO…


十三、WebSocket篇

websocket的连接, 模拟websocket客户端;

type WSClient interface

type WSClient interface {Send(body []byte) errorRead(data []byte) errorClose()
}

func WsClient(host, path string, isSSL bool) (WSClient, error)

新建ws客户端


func (c *webSocketClient) Send(body []byte) error

发送数据


func (c *webSocketClient) Close()

关闭连接


func (c *webSocketClient) Read(data []byte) error

读取数据


十四、TCP/UDP篇

Tcp的连接 (Tcp客户端); 应用场景是模拟Tcp客户端;

Udp的连接 (Udp客户端); 应用场景是模拟Udp客户端;

type TcpClient struct

type TcpClient struct {Connection *net.TCPConnHawkServer *net.TCPAddrStopChan   chan struct{}CmdChan chan stringToken stringRConn chan struct{}
}

func NewTcpClient() *TcpClient

实例化Tcp Client 对象


func (c *TcpClient) Send(b []byte) (int, error)

发送


func (c *TcpClient) Read(b []byte) (int, error)

接收


func (c *TcpClient) Addr() string

获取ip:port


func (c *TcpClient) Close()

关闭连接


func (c *TcpClient) Stop()

停止客户端


func (c *TcpClient) ReConn()

重连


func (c *TcpClient) Run(serverHost string, r func(c *TcpClient, data []byte), w func(c *TcpClient))

启动客户端


实例

func main(){client := gt.NewTcpClient()client.Run("192.168.0.9:29123", r, w)
}func w(client *gt.TcpClient){go func() {// 发送登录请求_,err := client.Send([]byte(`{"cmd":"Auth","data":{"account":"a10","password":"123456","device":"1","source":"windows"}}`))if err != nil {log.Println("err = ", err)}}()
}func r(client *gt.TcpClient) {go func() {for{recv := make([]byte, 1024)for {n, err := client.Read(recv)if err != nil{if err == io.EOF {log.Println(conn.Addr(), " 断开了连接!")conn.Close()return}}if n > 0 && n < 1025 {//conn.CmdChan <- string(recv[:n])log.Println(string(recv[:n]))}}}}()
}

type UdpClient struct

type UdpClient struct {SrcAddr *net.UDPAddrDstAddr *net.UDPAddrConn *net.UDPConnToken string
}

func NewUdpClient() *UdpClient

实例化udp客户端对象


func (u *UdpClient) Send(b []byte) (int, error)

发送数据


func (u *UdpClient) Read(b []byte) (int, *net.UDPAddr, error)

读取数据


func (u *UdpClient) Addr() string

获取地址


func (u *UdpClient) Close()

关闭连接


func (u *UdpClient) Run(hostServer string, port int, r func(u *UdpClient, data []byte), w func(u *UdpClient))

启动udp客户端


实例: TODO…


十五、SSH篇

func SSHClient(user string, pass string, addr string) (*ssh.Client, error)

返回 ssh连接

addr : 主机地址, 如: 127.0.0.1:22

user : 用户

pass : 密码


十六、代理&Socket5

func SocketProxy(addr string)

SocketProxy 启动一个socket5代理

func main(){gt.SockerProxy(":8111")
}

type Intercept struct

Intercept http/s 代理与抓包


func (ipt *Intercept) RunServer()

RunServer 启动 http/s 代理与抓包服务


func (ipt *Intercept) RunHttpIntercept()

RunHttpIntercept 启动 http/s 代理与抓包服务


type HttpPackage struct

HttpPackage 代理服务抓取到的HTTP的包


func (pack *HttpPackage) Img2Base64() string

Img2Base64 如果数据类型是image 就转换成base64的图片输出


func (pack *HttpPackage) Html() string

Html 数据类型是html


func (pack *HttpPackage) SaveImage(path string) error

SaveImage 如果数据类型是image 就保存图片


func (pack *HttpPackage) Json() string

Json 数据类型是json


func (pack *HttpPackage) Txt() string

Txt 数据类型是txt


func (pack *HttpPackage) ToFile(path string) error

ToFile 抓取到的数据类型保存到文件


实例

func main(){ipt := &gt.Intercept{Ip : "0.0.0.0:8111",HttpPackageFunc: func(pack *gt.HttpPackage){// 查看 ContentTypelog.Println("ContentType = ", pack.ContentType)// 获取数据包数据为 http,json等 TXT格式的数据log.Println("Txt = ", pack.Html())// 获取数据包为图片,将图片转为 base64log.Println("img base64 = ", pack.Img2Base64())// 获取数据包为图片,存储图片log.Println(pack.SaveImage(""))},}// 启动服务ipt.RunServer()
}

TODO…

未完待续…

查看全文

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.dgrt.cn/a/2128048.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章:

《gathertool开发使用文档》

《gathertool开发使用文档》
Date : 2023-03-28
Author : ManGe
Mail : 2912882908qq.com
Github : https://github.com/mangenotwork/gathertool 文章目录《gathertool开发使用文档》一、介绍1.1 简介1.2 使用1.3 介绍1.4 使用场景1.5 简单例子简单的get请求含请求事件请求……

el-date-picker:选择日期的限制

目录 前言:
基本使用:
时间区间:
公司业务:选择一个日期区间,但是只能选择本月
day.js简化版1
day.js简化版2 前言:
element-ui作为vue的龙头ui组件库,深受前端开发者的喜爱。
本文着重记……

指针的用法和注意事项(二)

指针及其大小、用法
指针的定义: 指针是一种变量类型,其值为另一个变量的地址,即内存位置的直接地址。就像其他变量或常量一样,必须在使用指针存储其他变量地址之前,对其进行声明。在 64 位计算机中,指针占 8 个字节空……

Linux系统安装部署及配置Grafana

TOC
用于 UI 展示
wget https://dl.grafana.com/oss/release/grafana-8.0.3-1.x86_64.rpm1 安装 grafana
1.1 下载安装
wget https://dl.grafana.com/oss/release/grafana-8.0.3-1.x86_64.rpmsudo yum install grafana-8.0.3-1.x86_64.rpm1.2 启动&状态查看
sudo syst……

python3中的heapq模块(堆排序)使用

一. heapq介绍
heapq-堆排序算法:heapq实现了一个适合与Python的列表一起使用的最小堆排序算法。
1. 二叉树
树中每个节点至多有两个子节点:
2. 满二叉树
树中除了叶子节点,每个节点都有两个子节点:
3. 完全二叉树
如果二……

算法设计与分析 实验五 贪心算法

1.活动选择:n项活动,每个活动指定起止时间,如果要求活动时间互不重叠,最多可以安排多少个活动。
入:每组数据第一行正整数 1 ≤ n ≤ 10000,接下来 n 行每行两个正整数 1 ≤ s < t ≤ 10000&……

06 FFmpeg用命令将视频转成RGB888或RGB565

FFmpeg用命令将视频转成RGB888或RGB565
作者将狼才鲸创建日期2023-03-31网上搜FFmpeg转RGB888,能搜到的东西很少,换了关键词后就能搜到了 ffmpeg命令行实现YUV和RGB之间格式的转换 FFmpeg转换yuv格式 使用ffmpeg从yuv到rgb的错误转换视频 ffmpeg常用命令……

Python上下文管理协议 __enter__ 和 __exit__

1.什么是上下文管理协议
上下文管理协议就是 with 语句, 为了让一个对象兼容with语句,必须在这个对象的类中声明__enter__()和__exit__()方法
with 对象,触发对象的__enter__的执行在with同一级别写代码, 脱离了with,就会执行 __exit__
class Open:def __enter__……

PriorityQueue(优先队列)、Java中Arrays.sort()的相似用法

在 Java 中,PriorityQueue 是一个队列(Queue)的实现,但它的元素是经过优先级排序的。PriorityQueue 元素的排序可以通过提供所添加元素的比较器或者元素自身实现 Comparable 接口来实现。
PriorityQueue 可以用来实现很多算法&am……

IO流之字符输入流

字符流是什么 字符流的读写类 字符流的输入流
空参read()方法
public class FileReader学 {public static void main(String[] args) throws IOException {/*字符输入流1、创建对象public FileReader(File file) 创建字符输入流关联本地文件public FileReader(String……

python以及PyCharm工具的环境安装与配置

这里以Windows为例
Python的安装
当然是到Python官网下载咯,https://www.python.org/downloads/点我直达,如图: 可以下载最新版本,可以下拉找到之前特定的版本安装,如图: 这里先择的是最新版的进行安装……

JavaScript【六】JavaScript中的字符串(String)

文章目录🌟前言🌟字符串(String)🌟单引号和双引号的区别🌟属性🌟 length :字符串的长度🌟 方法🌟 str.charAt(index);🌟 str.charCodeAt(index);🌟 String.fromCharCode(……

获取文件MD5小案例(未拆分文件)

文章目录前端获取MD5后端获取MD5前端获取MD5
1、引入js
<script src"js/spark-md5.min.js" type"text/javascript"></script>注:spark-md5库GitHub链接 2、这里是一个按钮和被隐藏调的<input/>标签 <body><button……

Java 进阶(15)线程安全集合

CopyOnWriteArrayList
线程安全的ArrayList,加强版读写分离。
写有锁,读⽆锁,读写之间不阻塞,优于读写锁。
写⼊时,先copy⼀个容器副本、再添加新元素,最后替换引⽤。
使⽤⽅式与ArrayList⽆异。
示例……

HR:面试官最爱问的linux问题,看看你能答对多少

文章目录摘要Linux的文件系统是什么样子的?如何访问和管理文件和目录?如何在Linux中查看和管理进程?如何使用Linux命令行工具来查看系统资源使用情况?如何配置Linux系统的网络设置?如何使用Linux的cron任务调度器来执行……

vscode开发常用的工具栏选项,查看源码技巧以及【vscode常用的快捷键】

一、开发常用的工具栏选项
1、当前打开的文件快速在左侧资源树中定位: 其实打开了当前的文件已经有在左侧资源树木定位了,只是颜色比较浅 2、打开太多文件的时候,可以关闭 3、设置查看当前类或文件的结构 OUTLINE
相当于idea 查看当前类或接……

数据要素化条件之一:原始性

随着技术的发展,计算机不仅成为人类处理信息的工具,而且逐渐地具有自主处理数据的能力,出现了替代人工的数据智能技术。数据智能的大规模使用需要关于同一分析对象或同一问题的、来源于不同数据源的海量数据。这种数据必须是针对特定对象的记……

【面试题 高逼格利用 类实现加法】编写代码, 实现多线程数组求和.

编写代码, 实现多线程数组求和.关键1. 数组的初始化关键2. 奇偶的相加import java.util.Random;public class Thread_2533 {public static void main(String[] args) throws InterruptedException {// 记录开始时间long start System.currentTimeMillis();// 1. 给定一个很长的……

一个python训练

美国:28:麻省理工学院,斯坦福大学,哈佛大学,加州理工学院,芝加哥大学,普林斯顿大学,宾夕法尼亚大学,耶鲁大学,康奈尔大学,哥伦比亚大学,密歇根大学安娜堡分校,约翰霍普金斯大学,西北大学,加州大学伯克利分校,纽约大学,加州大学洛杉矶分校,杜克大学,卡内基梅隆大学,加州大学圣地……

Mybatis03学习笔记

目录 使用注解开发
设置事务自动提交
mybatis运行原理
注解CRUD
lombok使用(偷懒神器,大神都不建议使用)
复杂查询环境(多对一)
复杂查询环境(一对多)
动态sql环境搭建
动态sql常用标签……

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注