update go mod

This commit is contained in:
白茶清欢 2023-07-27 17:58:40 +08:00
commit 55e14d3fd5
18 changed files with 1556 additions and 23 deletions

78
array.go Normal file
View File

@ -0,0 +1,78 @@
// Package util ...
//
// Description : util ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 2023-03-30 14:35
package util
import (
"encoding/json"
"fmt"
"reflect"
"strings"
)
type array struct {
}
// In 判断指定数据是否在目标数据集中, 不存在返回 -1 , 存在时返回数据对应的索引
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 14:38 2023/3/30
func (a *array) In(search interface{}, source interface{}) int {
if nil == source {
return -1
}
sourceType := reflect.TypeOf(source).Kind()
if sourceType != reflect.Array && sourceType != reflect.Slice {
return -1
}
byteData, _ := json.Marshal(source)
var (
formatSourceData []interface{}
)
_ = JSON.UnmarshalWithNumber(byteData, &formatSourceData)
if nil == search {
for idx, item := range formatSourceData {
if item == nil {
return idx
}
}
return -1
}
searchType := reflect.TypeOf(search).Kind()
for idx, item := range formatSourceData {
itemKind := reflect.TypeOf(item).Kind()
if searchType != itemKind {
// 类型不同, 检测是否为数字
if strings.Contains(searchType.String(), "int") || strings.Contains(searchType.String(), "float") {
// 查询的是数字
if _, ok := item.(json.Number); ok {
if fmt.Sprintf("%v", search) == fmt.Sprintf("%v", item) {
return idx
}
}
}
continue
}
if fmt.Sprintf("%v", search) == fmt.Sprintf("%v", item) {
return idx
}
}
return -1
}
// InAny In 函数的简化写法
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 16:25 2023/3/30
func (a *array) InAny(search interface{}, source ...interface{}) int {
return a.In(search, source)
}

21
array_test.go Normal file
View File

@ -0,0 +1,21 @@
// Package util ...
//
// Description : util ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 2023-03-30 14:43
package util
import (
"testing"
"github.com/stretchr/testify/assert"
)
func Test_array_In(t *testing.T) {
//assert.Equal(t, -1, Array.In(1234, []string{"1234", "123", "1"}))
assert.Equal(t, 0, Array.In(1234, []interface{}{1234, "123", "1"}))
//assert.Equal(t, -1, Array.In(nil, []interface{}{1234, "123", "1"}))
//assert.Equal(t, 3, Array.In(nil, []interface{}{1234, "123", "1", nil}))
}

33
browser.go Normal file
View File

@ -0,0 +1,33 @@
// Package util ...
//
// Description : util ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 2023-04-09 19:02
package util
import (
"fmt"
"os/exec"
"runtime"
)
type browser struct {
commandTable map[string]string
}
// Open 使用系统默认浏览器打开链接
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 19:05 2023/4/9
func (b *browser) Open(link string) error {
run, ok := b.commandTable[runtime.GOOS]
if !ok {
return fmt.Errorf("don't know how to open things on %s platform", runtime.GOOS)
}
cmd := exec.Command(run, link)
return cmd.Start()
}

103
console.go Normal file
View File

@ -0,0 +1,103 @@
// Package util ...
//
// Description : util ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 2023-04-04 16:09
package util
import (
"bytes"
"encoding/json"
"fmt"
"reflect"
)
// console 终端数据输出的一些操作
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 16:10 2023/4/4
type console struct {
enable bool
formatJson bool
}
// Enable 启用
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 16:10 2023/4/4
func (c *console) Enable() {
c.enable = true
}
// Disable 禁用
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 16:11 2023/4/4
func (c *console) Disable() {
c.enable = false
}
// FormatJson 是否格式化json
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 16:35 2023/4/4
func (c *console) FormatJson(format bool) {
c.formatJson = format
}
// Output 禁用终端输出
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 16:13 2023/4/4
func (c *console) Output(dataList ...interface{}) {
if !c.enable {
return
}
for _, item := range dataList {
fmt.Println(c.getDataStr(item))
}
}
// getDataStr 数据转换为字符串
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 16:14 2023/4/4
func (c *console) getDataStr(data interface{}) string {
if nil == data {
return "nil"
}
dataValue := reflect.ValueOf(data)
dataType := reflect.TypeOf(data).Kind()
if dataType == reflect.Ptr {
dataValue = dataValue.Elem()
}
switch dataValue.Kind() {
case reflect.Map:
fallthrough
case reflect.Slice:
fallthrough
case reflect.Array:
fallthrough
case reflect.Struct:
byteData, _ := json.Marshal(data)
if !c.formatJson {
return string(byteData)
}
var out bytes.Buffer
_ = json.Indent(&out, []byte(string(byteData)+"\n"), "", "\t")
return string(out.Bytes())
case reflect.Func:
return dataValue.String()
default:
return fmt.Sprintf("%v", data)
}
}

23
console_test.go Normal file
View File

@ -0,0 +1,23 @@
// Package util ...
//
// Description : util ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 2023-04-04 16:21
package util
import "testing"
func Test_console_Output(t *testing.T) {
Console.Enable()
var a = map[string]interface{}{
"name": "baicha",
}
type U struct {
Name string
}
b := &U{Name: "qinghuan"}
c := U{Name: "test"}
Console.Output(a, b, c)
}

23
file.go
View File

@ -9,6 +9,7 @@ package util
import ( import (
"io/ioutil" "io/ioutil"
"net/http"
"os" "os"
"strings" "strings"
@ -156,3 +157,25 @@ func (f *file) IsFileExist(filePath string) (bool, bool) {
fileStat, err := os.Stat(filePath) fileStat, err := os.Stat(filePath)
return nil == err || os.IsExist(err), (nil == err || os.IsExist(err)) && !fileStat.IsDir() return nil == err || os.IsExist(err), (nil == err || os.IsExist(err)) && !fileStat.IsDir()
} }
// GetFileMIMEType 获取本地文件的MIME类型
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 17:15 2023/2/7
func (f *file) GetFileMIMEType(filePath string) (string, error) {
var (
err error
fileHandler *os.File
)
if fileHandler, err = os.Open(filePath); nil != err {
return "", err
}
// 只需要前 512 个字节就可以了
buffer := make([]byte, 512)
if _, err = fileHandler.Read(buffer); nil != err {
return "", err
}
contentType := http.DetectContentType(buffer)
return contentType, nil
}

18
go.mod
View File

@ -1,21 +1,27 @@
module git.zhangdeman.cn/zhangdeman/util module git.zhangdeman.cn/zhangdeman/util
go 1.17 go 1.20
require ( require (
github.com/Jeffail/gabs v1.4.0 github.com/Jeffail/gabs v1.4.0
github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394 github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394
github.com/go-ini/ini v1.66.6 github.com/dgrijalva/jwt-go v3.2.0+incompatible
github.com/go-ini/ini v1.67.0
github.com/mitchellh/go-homedir v1.1.0
github.com/mozillazg/go-pinyin v0.20.0
github.com/mssola/user_agent v0.6.0
github.com/pkg/errors v0.9.1 github.com/pkg/errors v0.9.1
github.com/spaolacci/murmur3 v1.1.0 github.com/spaolacci/murmur3 v1.1.0
github.com/tidwall/gjson v1.14.1 github.com/stretchr/testify v1.8.2
github.com/tebeka/selenium v0.9.9
github.com/tidwall/gjson v1.14.4
gopkg.in/yaml.v3 v3.0.1 gopkg.in/yaml.v3 v3.0.1
) )
require ( require (
github.com/blang/semver v3.5.1+incompatible // indirect github.com/blang/semver v3.5.1+incompatible // indirect
github.com/stretchr/testify v1.8.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect
github.com/tebeka/selenium v0.9.9 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/match v1.1.1 // indirect
github.com/tidwall/pretty v1.2.0 // indirect github.com/tidwall/pretty v1.2.1 // indirect
) )

29
go.sum
View File

@ -3,10 +3,13 @@ cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
cloud.google.com/go v0.41.0/go.mod h1:OauMR7DV8fzvZIl2qg6rkaIhD/vmgk4iwEw/h6ercmg= cloud.google.com/go v0.41.0/go.mod h1:OauMR7DV8fzvZIl2qg6rkaIhD/vmgk4iwEw/h6ercmg=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802 h1:1BDTz0u9nC3//pOCMdNH+CiXJVYJh5UQNCOBG7jbELc=
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
github.com/BurntSushi/xgbutil v0.0.0-20160919175755-f7c97cef3b4e h1:4ZrkT/RzpnROylmoQL57iVUL57wGKTR5O6KpVnbm2tA=
github.com/BurntSushi/xgbutil v0.0.0-20160919175755-f7c97cef3b4e/go.mod h1:uw9h2sd4WWHOPdJ13MQpwK5qYWKYDumDqxWWIknEQ+k= github.com/BurntSushi/xgbutil v0.0.0-20160919175755-f7c97cef3b4e/go.mod h1:uw9h2sd4WWHOPdJ13MQpwK5qYWKYDumDqxWWIknEQ+k=
github.com/Jeffail/gabs v1.4.0 h1://5fYRRTq1edjfIrQGvdkcd22pkYUrHZ5YC/H2GJVAo= github.com/Jeffail/gabs v1.4.0 h1://5fYRRTq1edjfIrQGvdkcd22pkYUrHZ5YC/H2GJVAo=
github.com/Jeffail/gabs v1.4.0/go.mod h1:6xMvQMK4k33lb7GUUpaAPh6nKMmemQeg5d4gn7/bOXc= github.com/Jeffail/gabs v1.4.0/go.mod h1:6xMvQMK4k33lb7GUUpaAPh6nKMmemQeg5d4gn7/bOXc=
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394 h1:OYA+5W64v3OgClL+IrOD63t4i/RW7RqrAVl9LTZ9UqQ= github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394 h1:OYA+5W64v3OgClL+IrOD63t4i/RW7RqrAVl9LTZ9UqQ=
github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394/go.mod h1:Q8n74mJTIgjX4RBBcHnJ05h//6/k6foqmgE45jTQtxg= github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394/go.mod h1:Q8n74mJTIgjX4RBBcHnJ05h//6/k6foqmgE45jTQtxg=
@ -16,8 +19,11 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/go-ini/ini v1.66.6 h1:h6k2Bb0HWS/BXXHCXj4QHjxPmlIU4NK+7MuLp9SD+4k= github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
github.com/go-ini/ini v1.66.6/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
github.com/go-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A=
github.com/go-ini/ini v1.67.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
@ -27,6 +33,7 @@ github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-github/v27 v27.0.4/go.mod h1:/0Gr8pJ55COkmv+S/yPKCczSkUPIM/LnFyubufRNIS0= github.com/google/go-github/v27 v27.0.4/go.mod h1:/0Gr8pJ55COkmv+S/yPKCczSkUPIM/LnFyubufRNIS0=
github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
@ -38,6 +45,12 @@ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5m
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
github.com/mozillazg/go-pinyin v0.20.0 h1:BtR3DsxpApHfKReaPO1fCqF4pThRwH9uwvXzm+GnMFQ=
github.com/mozillazg/go-pinyin v0.20.0/go.mod h1:iR4EnMMRXkfpFVV5FMi4FNB6wGq9NV6uDWbUuPhP4Yc=
github.com/mssola/user_agent v0.6.0 h1:uwPR4rtWlCHRFyyP9u2KOV0u8iQXmS7Z7feTrstQwk4=
github.com/mssola/user_agent v0.6.0/go.mod h1:TTPno8LPY3wAIEKRpAtkdMT0f8SE24pLRGPahjCH4uw=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
@ -46,17 +59,20 @@ github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0b
github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8=
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/tebeka/selenium v0.9.9 h1:cNziB+etNgyH/7KlNI7RMC1ua5aH1+5wUlFQyzeMh+w= github.com/tebeka/selenium v0.9.9 h1:cNziB+etNgyH/7KlNI7RMC1ua5aH1+5wUlFQyzeMh+w=
github.com/tebeka/selenium v0.9.9/go.mod h1:5Fr8+pUvU6B1OiPfkdCKdXZyr5znvVkxuPd0NOdZCQc= github.com/tebeka/selenium v0.9.9/go.mod h1:5Fr8+pUvU6B1OiPfkdCKdXZyr5znvVkxuPd0NOdZCQc=
github.com/tidwall/gjson v1.14.1 h1:iymTbGkQBhveq21bEvAQ81I0LEBork8BFe1CUZXdyuo= github.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM=
github.com/tidwall/gjson v1.14.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=
github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=
github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=
github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
@ -79,6 +95,7 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn
golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859 h1:R/3boaszxrf1GEUWTVDzSKVwLmSJpwZ1yqXm8j0v2QI=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=

33
init.go
View File

@ -31,7 +31,21 @@ var (
// Calculate ... // Calculate ...
Calculate *calculate Calculate *calculate
// Project ... // Project ...
Project = &project{} Project *project
// 数组操作
Array *array
// JWT ...
JWT *ownJwt
// UserAgent ...
UserAgent *userAgent
// Console 控制台输出数据
Console *console
// Browser 浏览器操作实例
Browser *browser
// StringConvert 字符串转为任意类型
StringConvert *stringConvert
// PinYin 汉字转拼音
PinYin *pinYin
) )
func init() { func init() {
@ -46,4 +60,21 @@ func init() {
URL = &ownURL{} URL = &ownURL{}
Map = &ownMap{} Map = &ownMap{}
Calculate = &calculate{} Calculate = &calculate{}
Project = &project{}
Array = &array{}
JWT = &ownJwt{}
UserAgent = &userAgent{
list: defaultUserAgentList,
}
Console = &console{}
Browser = &browser{
commandTable: map[string]string{
"windows": "start",
"darwin": "open",
"linux": "xdg-open",
},
}
// StringConvert
StringConvert = &stringConvert{}
PinYin = &pinYin{}
} }

29
json.go
View File

@ -46,6 +46,35 @@ func (oj *ownJSON) UnmarshalWithNumberForIOReader(ioReader io.ReadCloser, receiv
return decoder.Decode(receiver) return decoder.Decode(receiver)
} }
// UnmarshalWithNumberForString 字符串转结构体
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 21:50 2023/7/22
func (oj *ownJSON) UnmarshalWithNumberForString(input string, receiver interface{}) error {
return oj.UnmarshalWithNumber([]byte(input), receiver)
}
// MarshalForByte 序列化并返回字节数组
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 21:56 2023/7/22
func (oj *ownJSON) MarshalForByte(input interface{}) []byte {
byteData, _ := json.Marshal(input)
return byteData
}
// MarshalForString 序列化并返回字符串
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 21:56 2023/7/22
func (oj *ownJSON) MarshalForString(input interface{}) string {
byteData := oj.MarshalForByte(input)
return string(byteData)
}
// ConsoleOutput ... // ConsoleOutput ...
// //
// Author : go_developer@163.com<白茶清欢> // Author : go_developer@163.com<白茶清欢>

66
jwt.go Normal file
View File

@ -0,0 +1,66 @@
// Package util ...
//
// Description : go-jwt具体实现
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 2023-02-11 20:09
package util
import (
"errors"
"github.com/dgrijalva/jwt-go"
)
type ownJwt struct {
}
type MyClaims struct {
jwt.StandardClaims
}
// Generate 生成 token
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 20:13 2023/2/11
func (j *ownJwt) Generate(signMethod jwt.SigningMethod, secret string, claims jwt.Claims) (string, error) {
if nil == signMethod {
signMethod = jwt.SigningMethodHS256
}
var (
token *jwt.Token
)
if nil == claims {
token = jwt.New(signMethod)
} else {
token = jwt.NewWithClaims(signMethod, claims)
}
return token.SignedString([]byte(secret))
}
// Validate 验证token
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 20:13 2023/2/11
func (j *ownJwt) Validate(inputToken string, secret string, claims jwt.Claims) (jwt.Claims, error) {
var (
token *jwt.Token
err error
)
if token, err = jwt.ParseWithClaims(inputToken, claims, func(tokenInfo *jwt.Token) (interface{}, error) {
return []byte(secret), nil
}); nil != err {
return nil, errors.New("token parse fail : " + err.Error())
}
if !token.Valid {
return nil, errors.New("token is valid : " + err.Error())
}
return token.Claims, nil
}

13
map.go
View File

@ -214,3 +214,16 @@ func (om *ownMap) GetDataWithReceiver(source map[interface{}]interface{}, key in
} }
return ConvertAssign(receiver, source[key]) return ConvertAssign(receiver, source[key])
} }
// ToStruct map转结构体
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 21:48 2023/7/22
func (om *ownMap) ToStruct(source map[string]interface{}, receiver interface{}) error {
if nil == source {
return nil
}
byteData := JSON.MarshalForByte(source)
return JSON.UnmarshalWithNumber(byteData, receiver)
}

View File

@ -12,6 +12,8 @@ import (
"path/filepath" "path/filepath"
"runtime" "runtime"
"strings" "strings"
"github.com/mitchellh/go-homedir"
) )
type project struct { type project struct {
@ -88,3 +90,13 @@ func (p *project) GetProjectPath() string {
dir, _ := os.Getwd() dir, _ := os.Getwd()
return dir return dir
} }
// GetHomeDir 获取家目录
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 22:31 2023/4/18
func (p *project) GetHomeDir() string {
homePath, _ := homedir.Dir()
return homePath
}

View File

@ -17,6 +17,14 @@ import (
"github.com/axgle/mahonia" "github.com/axgle/mahonia"
) )
var (
// LETTER_LIST 字母列表
LETTER_LIST = []string{
"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n",
"o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z",
}
)
// stringOperate ... // stringOperate ...
// //
// Author : go_developer@163.com<白茶清欢> // Author : go_developer@163.com<白茶清欢>
@ -172,3 +180,24 @@ func (s *stringOperate) ClearChar(src string, charList ...string) string {
} }
return src return src
} }
// ReplaceChineseChar 替换常见的中文符号
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 16:59 2023/4/4
func (s *stringOperate) ReplaceChineseChar(str string) string {
charTable := map[string]string{
"": "(",
"": ")",
"": ":",
"": ",",
"。": ".",
"【": "]",
"】": "]",
}
for k, v := range charTable {
str = strings.ReplaceAll(str, k, v)
}
return str
}

653
string_convert.go Normal file
View File

@ -0,0 +1,653 @@
// Package util ...
//
// Description : util ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 2023-05-04 18:25
package util
import (
"strings"
"github.com/pkg/errors"
)
type stringConvert struct {
}
// ToFloat32 ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 18:26 2023/5/4
func (sc *stringConvert) ToFloat32(str string) (float32, error) {
var (
err error
res float32
)
err = ConvertAssign(&res, str)
return res, err
}
// ToFloat64 ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 18:26 2023/5/4
func (sc *stringConvert) ToFloat64(str string) (float64, error) {
var (
err error
res float64
)
err = ConvertAssign(&res, str)
return res, err
}
// ToDouble 转double
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 18:33 2023/5/4
func (sc *stringConvert) ToDouble(str string) (float64, error) {
return sc.ToFloat64(str)
}
// ToNumber 转数字, 使用最高精度的float64
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 18:33 2023/5/4
func (sc *stringConvert) ToNumber(str string) (float64, error) {
return sc.ToFloat64(str)
}
// ToInt8 ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 18:29 2023/5/4
func (sc *stringConvert) ToInt8(str string) (int8, error) {
var (
err error
res int8
)
err = ConvertAssign(&res, str)
return res, err
}
// ToInt16 ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 18:29 2023/5/4
func (sc *stringConvert) ToInt16(str string) (int16, error) {
var (
err error
res int16
)
err = ConvertAssign(&res, str)
return res, err
}
// ToInt32 ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 18:29 2023/5/4
func (sc *stringConvert) ToInt32(str string) (int32, error) {
var (
err error
res int32
)
err = ConvertAssign(&res, str)
return res, err
}
// ToInt64 ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 18:29 2023/5/4
func (sc *stringConvert) ToInt64(str string) (int64, error) {
var (
err error
res int64
)
err = ConvertAssign(&res, str)
return res, err
}
// ToInt ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 10:47 2023/5/5
func (sc *stringConvert) ToInt(str string) (int, error) {
var (
err error
res int
)
err = ConvertAssign(&res, str)
return res, err
}
// ToUint8 ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 18:30 2023/5/4
func (sc *stringConvert) ToUint8(str string) (uint8, error) {
var (
err error
res uint8
)
err = ConvertAssign(&res, str)
return res, err
}
// ToUint16 ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 18:29 2023/5/4
func (sc *stringConvert) ToUint16(str string) (uint16, error) {
var (
err error
res uint16
)
err = ConvertAssign(&res, str)
return res, err
}
// ToUint32 ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 18:29 2023/5/4
func (sc *stringConvert) ToUint32(str string) (uint32, error) {
var (
err error
res uint32
)
err = ConvertAssign(&res, str)
return res, err
}
// ToUint64 ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 18:29 2023/5/4
func (sc *stringConvert) ToUint64(str string) (uint64, error) {
var (
err error
res uint64
)
err = ConvertAssign(&res, str)
return res, err
}
// ToUint ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 18:29 2023/5/4
func (sc *stringConvert) ToUint(str string) (uint, error) {
var (
err error
res uint
)
err = ConvertAssign(&res, str)
return res, err
}
// ToBool ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 18:34 2023/5/4
func (sc *stringConvert) ToBool(str string) (bool, error) {
var (
err error
res bool
)
err = ConvertAssign(&res, str)
return res, err
}
// ToObject ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 18:35 2023/5/4
func (sc *stringConvert) ToObject(str string) (map[string]interface{}, error) {
var (
err error
result map[string]interface{}
)
if err = JSON.UnmarshalWithNumber([]byte(str), &result); nil != err {
return nil, err
}
return result, nil
}
// ToStruct ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 18:38 2023/5/4
func (sc *stringConvert) ToStruct(str string, receiver interface{}) error {
if nil == receiver {
return errors.New("receiver is nil")
}
return JSON.UnmarshalWithNumber([]byte(str), receiver)
}
// ToInt8Slice ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 18:55 2023/5/4
func (sc *stringConvert) ToInt8Slice(str string, splitChar ...string) ([]int8, error) {
var (
err error
res []int8
)
isSplit := len(splitChar) > 0
if !isSplit {
if err = JSON.UnmarshalWithNumber([]byte(str), &res); nil != err {
return nil, err
}
return res, nil
}
res = make([]int8, 0)
arr := strings.Split(str, splitChar[0])
for _, item := range arr {
if itemVal, err := sc.ToInt8(item); nil != err {
return nil, err
} else {
res = append(res, itemVal)
}
}
return res, nil
}
// ToInt16Slice ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 19:01 2023/5/4
func (sc *stringConvert) ToInt16Slice(str string, splitChar ...string) ([]int16, error) {
var (
err error
res []int16
)
isSplit := len(splitChar) > 0
if !isSplit {
if err = JSON.UnmarshalWithNumber([]byte(str), &res); nil != err {
return nil, err
}
return res, nil
}
res = make([]int16, 0)
arr := strings.Split(str, splitChar[0])
for _, item := range arr {
if itemVal, err := sc.ToInt16(item); nil != err {
return nil, err
} else {
res = append(res, itemVal)
}
}
return res, nil
}
// ToInt32Slice ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 19:03 2023/5/4
func (sc *stringConvert) ToInt32Slice(str string, splitChar ...string) ([]int32, error) {
var (
err error
res []int32
)
isSplit := len(splitChar) > 0
if !isSplit {
if err = JSON.UnmarshalWithNumber([]byte(str), &res); nil != err {
return nil, err
}
return res, nil
}
res = make([]int32, 0)
arr := strings.Split(str, splitChar[0])
for _, item := range arr {
if itemVal, err := sc.ToInt32(item); nil != err {
return nil, err
} else {
res = append(res, itemVal)
}
}
return res, nil
}
// ToInt64Slice ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 19:04 2023/5/4
func (sc *stringConvert) ToInt64Slice(str string, splitChar ...string) ([]int64, error) {
var (
err error
res []int64
)
isSplit := len(splitChar) > 0
if !isSplit {
if err = JSON.UnmarshalWithNumber([]byte(str), &res); nil != err {
return nil, err
}
return res, nil
}
res = make([]int64, 0)
arr := strings.Split(str, splitChar[0])
for _, item := range arr {
if itemVal, err := sc.ToInt64(item); nil != err {
return nil, err
} else {
res = append(res, itemVal)
}
}
return res, nil
}
// ToIntSlice ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 19:04 2023/5/4
func (sc *stringConvert) ToIntSlice(str string, splitChar ...string) ([]int, error) {
var (
err error
res []int
)
isSplit := len(splitChar) > 0
if !isSplit {
if err = JSON.UnmarshalWithNumber([]byte(str), &res); nil != err {
return nil, err
}
return res, nil
}
res = make([]int, 0)
arr := strings.Split(str, splitChar[0])
for _, item := range arr {
if itemVal, err := sc.ToInt(item); nil != err {
return nil, err
} else {
res = append(res, itemVal)
}
}
return res, nil
}
// ToUint8Slice ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 10:50 2023/5/5
func (sc *stringConvert) ToUint8Slice(str string, splitChar ...string) ([]uint8, error) {
var (
err error
res []uint8
)
isSplit := len(splitChar) > 0
if !isSplit {
if err = JSON.UnmarshalWithNumber([]byte(str), &res); nil != err {
return nil, err
}
return res, nil
}
res = make([]uint8, 0)
arr := strings.Split(str, splitChar[0])
for _, item := range arr {
if itemVal, err := sc.ToUint8(item); nil != err {
return nil, err
} else {
res = append(res, itemVal)
}
}
return res, nil
}
// ToUint16Slice ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 10:52 2023/5/5
func (sc *stringConvert) ToUint16Slice(str string, splitChar ...string) ([]uint16, error) {
var (
err error
res []uint16
)
isSplit := len(splitChar) > 0
if !isSplit {
if err = JSON.UnmarshalWithNumber([]byte(str), &res); nil != err {
return nil, err
}
return res, nil
}
res = make([]uint16, 0)
arr := strings.Split(str, splitChar[0])
for _, item := range arr {
if itemVal, err := sc.ToUint16(item); nil != err {
return nil, err
} else {
res = append(res, itemVal)
}
}
return res, nil
}
// ToUint32Slice ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 10:53 2023/5/5
func (sc *stringConvert) ToUint32Slice(str string, splitChar ...string) ([]uint32, error) {
var (
err error
res []uint32
)
isSplit := len(splitChar) > 0
if !isSplit {
if err = JSON.UnmarshalWithNumber([]byte(str), &res); nil != err {
return nil, err
}
return res, nil
}
res = make([]uint32, 0)
arr := strings.Split(str, splitChar[0])
for _, item := range arr {
if itemVal, err := sc.ToUint32(item); nil != err {
return nil, err
} else {
res = append(res, itemVal)
}
}
return res, nil
}
// ToUint64Slice ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 10:54 2023/5/5
func (sc *stringConvert) ToUint64Slice(str string, splitChar ...string) ([]uint64, error) {
var (
err error
res []uint64
)
isSplit := len(splitChar) > 0
if !isSplit {
if err = JSON.UnmarshalWithNumber([]byte(str), &res); nil != err {
return nil, err
}
return res, nil
}
res = make([]uint64, 0)
arr := strings.Split(str, splitChar[0])
for _, item := range arr {
if itemVal, err := sc.ToUint64(item); nil != err {
return nil, err
} else {
res = append(res, itemVal)
}
}
return res, nil
}
// ToUintSlice ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 10:54 2023/5/5
func (sc *stringConvert) ToUintSlice(str string, splitChar ...string) ([]uint, error) {
var (
err error
res []uint
)
isSplit := len(splitChar) > 0
if !isSplit {
if err = JSON.UnmarshalWithNumber([]byte(str), &res); nil != err {
return nil, err
}
return res, nil
}
res = make([]uint, 0)
arr := strings.Split(str, splitChar[0])
for _, item := range arr {
if itemVal, err := sc.ToUint(item); nil != err {
return nil, err
} else {
res = append(res, itemVal)
}
}
return res, nil
}
// ToBoolSlice ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 10:55 2023/5/5
func (sc *stringConvert) ToBoolSlice(str string, splitChar ...string) ([]bool, error) {
var (
err error
res []bool
)
isSplit := len(splitChar) > 0
if !isSplit {
if err = JSON.UnmarshalWithNumber([]byte(str), &res); nil != err {
return nil, err
}
return res, nil
}
res = make([]bool, 0)
arr := strings.Split(str, splitChar[0])
for _, item := range arr {
if itemVal, err := sc.ToBool(item); nil != err {
return nil, err
} else {
res = append(res, itemVal)
}
}
return res, nil
}
// ToFloat32Slice ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 10:56 2023/5/5
func (sc *stringConvert) ToFloat32Slice(str string, splitChar ...string) ([]float32, error) {
var (
err error
res []float32
)
isSplit := len(splitChar) > 0
if !isSplit {
if err = JSON.UnmarshalWithNumber([]byte(str), &res); nil != err {
return nil, err
}
return res, nil
}
res = make([]float32, 0)
arr := strings.Split(str, splitChar[0])
for _, item := range arr {
if itemVal, err := sc.ToFloat32(item); nil != err {
return nil, err
} else {
res = append(res, itemVal)
}
}
return res, nil
}
// ToFloat64Slice ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 10:56 2023/5/5
func (sc *stringConvert) ToFloat64Slice(str string, splitChar ...string) ([]float64, error) {
var (
err error
res []float64
)
isSplit := len(splitChar) > 0
if !isSplit {
if err = JSON.UnmarshalWithNumber([]byte(str), &res); nil != err {
return nil, err
}
return res, nil
}
res = make([]float64, 0)
arr := strings.Split(str, splitChar[0])
for _, item := range arr {
if itemVal, err := sc.ToFloat64(item); nil != err {
return nil, err
} else {
res = append(res, itemVal)
}
}
return res, nil
}
// ToDoubleSlice ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 10:57 2023/5/5
func (sc *stringConvert) ToDoubleSlice(str string, splitChar ...string) ([]float64, error) {
return sc.ToFloat64Slice(str, splitChar...)
}
// ToNumberSlice ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 10:57 2023/5/5
func (sc *stringConvert) ToNumberSlice(str string, splitChar ...string) ([]float64, error) {
return sc.ToFloat64Slice(str, splitChar...)
}

32
time.go
View File

@ -18,6 +18,7 @@ import (
// //
// Date : 15:24 2022/5/14 // Date : 15:24 2022/5/14
type ownTime struct { type ownTime struct {
format string
} }
// GetCurrentFormatTime 获取当前时间的格式化时间(秒) // GetCurrentFormatTime 获取当前时间的格式化时间(秒)
@ -25,8 +26,11 @@ type ownTime struct {
// Author : go_developer@163.com<白茶清欢> // Author : go_developer@163.com<白茶清欢>
// //
// Date : 1:34 上午 2021/10/7 // Date : 1:34 上午 2021/10/7
func (ot *ownTime) GetCurrentFormatTime() string { func (ot *ownTime) GetCurrentFormatTime(layout ...string) string {
return time.Now().Format("2006-01-02 15:04:05") if len(layout) == 0 {
layout = []string{"2006-01-02 15:04:05"}
}
return time.Now().In(time.Local).Format(layout[0])
} }
// FormatUnixNano 格式化纳秒时间戳 // FormatUnixNano 格式化纳秒时间戳
@ -34,10 +38,13 @@ func (ot *ownTime) GetCurrentFormatTime() string {
// Author : go_developer@163.com<白茶清欢> // Author : go_developer@163.com<白茶清欢>
// //
// Date : 11:54 2022/7/14 // Date : 11:54 2022/7/14
func (ot *ownTime) FormatUnixNano(timestamp int64) string { func (ot *ownTime) FormatUnixNano(timestamp int64, layout ...string) string {
if len(layout) == 0 {
layout = []string{"2006-01-02 15:04:05.000"}
}
nano := timestamp % 1e6 nano := timestamp % 1e6
milli := timestamp / 1e6 milli := timestamp / 1e6
return ot.FormatUnixMilli(milli) + fmt.Sprintf(" %v", nano) return ot.FormatUnixMilli(milli, layout...) + fmt.Sprintf(" %v", nano)
} }
// FormatUnixMilli 格式化毫秒时间戳 // FormatUnixMilli 格式化毫秒时间戳
@ -45,9 +52,11 @@ func (ot *ownTime) FormatUnixNano(timestamp int64) string {
// Author : go_developer@163.com<白茶清欢> // Author : go_developer@163.com<白茶清欢>
// //
// Date : 11:55 2022/7/14 // Date : 11:55 2022/7/14
func (ot *ownTime) FormatUnixMilli(timestamp int64) string { func (ot *ownTime) FormatUnixMilli(timestamp int64, layout ...string) string {
time.Now().UnixMilli() if len(layout) == 0 {
return time.UnixMilli(timestamp).Format("2006-01-02 15:04:05.000") layout = []string{"2006-01-02 15:04:05.000"}
}
return time.UnixMilli(timestamp).In(time.Local).Format(layout[0])
} }
// FormatUnixSec ... // FormatUnixSec ...
@ -55,8 +64,11 @@ func (ot *ownTime) FormatUnixMilli(timestamp int64) string {
// Author : go_developer@163.com<白茶清欢> // Author : go_developer@163.com<白茶清欢>
// //
// Date : 12:06 2022/7/14 // Date : 12:06 2022/7/14
func (ot *ownTime) FormatUnixSec(timestamp int64) string { func (ot *ownTime) FormatUnixSec(timestamp int64, layout ...string) string {
return time.UnixMilli(timestamp).Format("2006-01-02 15:04:05") if len(layout) == 0 {
layout = []string{"2006-01-02 15:04:05"}
}
return time.Unix(timestamp, 0).In(time.Local).Format(layout[0])
} }
// ParseISO8601Time 解析 2006-01-02T15:04:05+08:00 格式时间 -> 2006-01-02 15:04:05 // ParseISO8601Time 解析 2006-01-02T15:04:05+08:00 格式时间 -> 2006-01-02 15:04:05
@ -75,5 +87,5 @@ func (ot *ownTime) ParseISO8601Time(parseTime string) string {
return "" return ""
} }
return formatTime.Format("2006-01-02 15:04:05") return formatTime.In(time.Local).Format("2006-01-02 15:04:05")
} }

176
user_agent.go Normal file
View File

@ -0,0 +1,176 @@
// Package util ...
//
// Description : util ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 2023-03-31 18:51
package util
import (
"math/rand"
"time"
"github.com/mssola/user_agent"
)
var defaultUserAgentList = []string{
"Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko Fedora/1.9.0.8-1.fc10 Kazehakase/0.5.6",
"Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SV1; QQDownload 732; .NET4.0C; .NET4.0E; 360SE)",
"Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.20 (KHTML, like Gecko) Chrome/19.0.1036.7 Safari/535.20",
"Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko Fedora/1.9.0.8-1.fc10 Kazehakase/0.5.6",
"Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)",
"Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.12) Gecko/20070731 Ubuntu/dapper-security Firefox/1.5.0.12",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E; LBBROWSER)",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1",
"Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.3 Mobile/14E277 Safari/603.1.30",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1",
"(KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
"Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11",
"(KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6",
"(KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6",
"(KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1",
"(KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5",
"(KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5",
"Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5",
"(KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3",
"(KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3",
"(KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3",
"(KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3",
"(KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3",
"(KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3",
"(KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3",
"(KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3",
"(KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3",
"(KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24",
"(KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24",
"(KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",
}
type userAgent struct {
list []string
}
// Set 设置ua池
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 18:55 2023/3/31
func (ua *userAgent) Set(agentList []string) {
if len(agentList) == 0 {
return
}
ua.list = agentList
}
// GetRandomUA 随机获取UA
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 18:56 2023/3/31
func (ua *userAgent) GetRandomUA() string {
rand.Seed(time.Now().UnixNano())
idx := rand.Intn(len(ua.list))
return ua.list[idx]
}
// Parse 解析UA
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 16:31 2023/4/20
func (ua *userAgent) Parse(inputUA string) *UAInfo {
uaInstance := user_agent.New(inputUA)
uaInfo := &UAInfo{
Mozilla: uaInstance.Mozilla(),
Platform: uaInstance.Platform(),
OS: uaInstance.OS(),
Localization: uaInstance.Localization(),
Model: uaInstance.Model(),
Browser: &BrowserInfo{
Engine: "",
EngineVersion: "",
Name: "",
Version: "",
},
OSInfo: &OSInfo{
FullName: uaInstance.OSInfo().FullName,
Name: uaInstance.OSInfo().Name,
Version: uaInstance.OSInfo().Version,
},
Bot: false,
Mobile: false,
Undecided: false,
}
uaInfo.Browser.Engine, uaInfo.Browser.EngineVersion = uaInstance.Engine()
uaInfo.Browser.Name, uaInfo.Browser.Version = uaInstance.Browser()
return uaInfo
}
// UAInfo ua解析结果
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 16:34 2023/4/20
type UAInfo struct {
Mozilla string `json:"mozilla"`
Platform string `json:"platform"`
OS string `json:"os"`
OSInfo *OSInfo `json:"os_info"`
Localization string `json:"localization"`
Model string `json:"model"`
Browser *BrowserInfo `json:"browser"`
Bot bool `json:"bot"`
Mobile bool `json:"mobile"`
Undecided bool `json:"undecided"`
}
// BrowserInfo 浏览器信息
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 16:34 2023/4/20
type BrowserInfo struct {
Engine string `json:"engine"` // 浏览器引擎
EngineVersion string `json:"engine_version"` // 浏览器引擎版本
Name string `json:"name"` // 浏览器名称
Version string `json:"version"` // 浏览器版本
}
// OSInfo 系统信息
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 16:34 2023/4/20
type OSInfo struct {
FullName string `json:"full_name"` // 操作系统全称
Name string `json:"name"` // 操作系统名称
Version string `json:"version"` // 操作系统版本
}

208
util.go Normal file
View File

@ -0,0 +1,208 @@
// Package util ...
//
// Description : util ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 2023-06-25 17:22
package util
import "github.com/mozillazg/go-pinyin"
// PinYinArg 设置选项方法
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 17:33 2023/6/25
type PinYinArg func(arg *pinyin.Args)
// 拼音风格的设置
// PinYinStyleNormal ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 17:37 2023/6/25
func PinYinStyleNormal() PinYinArg {
return func(arg *pinyin.Args) {
arg.Style = pinyin.Normal
}
}
// PinYinStyleToneStand 声调风格1拼音声调在韵母第一个字母上。如 zhōng guó
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 17:38 2023/6/25
func PinYinStyleToneStand() PinYinArg {
return func(arg *pinyin.Args) {
arg.Style = pinyin.Tone
}
}
// PinYinStyleToneAfterYunMu 声调风格2即拼音声调在各个韵母之后用数字 [1-4] 进行表示。如: zho1ng guo2
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 17:39 2023/6/25
func PinYinStyleToneAfterYunMu() PinYinArg {
return func(arg *pinyin.Args) {
arg.Style = pinyin.Tone2
}
}
// PinYinStyleToneAtEnding 声调风格3即拼音声调在各个拼音之后用数字 [1-4] 进行表示。如: zhong1 guo2
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 17:40 2023/6/25
func PinYinStyleToneAtEnding() PinYinArg {
return func(arg *pinyin.Args) {
arg.Style = pinyin.Tone3
}
}
// PinYinStyleShengMu 声母风格,只返回各个拼音的声母部分。如: zh g 。注意:不是所有的拼音都有声母
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 17:41 2023/6/25
func PinYinStyleShengMu() PinYinArg {
return func(arg *pinyin.Args) {
arg.Style = pinyin.Initials
}
}
// PinYinStyleFirstLetter 首字母风格,只返回拼音的首字母部分。如: z g
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 17:42 2023/6/25
func PinYinStyleFirstLetter() PinYinArg {
return func(arg *pinyin.Args) {
arg.Style = pinyin.FirstLetter
}
}
// PinYinStyleYunMu 韵母风格,只返回各个拼音的韵母部分,不带声调。如: ong uo
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 17:43 2023/6/25
func PinYinStyleYunMu() PinYinArg {
return func(arg *pinyin.Args) {
arg.Style = pinyin.Finals
}
}
// PinYinStyleToneYunMu 韵母风格1带声调声调在韵母第一个字母上。如 ōng uó
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 17:44 2023/6/25
func PinYinStyleToneYunMu() PinYinArg {
return func(arg *pinyin.Args) {
arg.Style = pinyin.FinalsTone
}
}
// PinYinStyleToneYunMuAtStart 韵母风格2带声调声调在各个韵母之后用数字 [1-4] 进行表示。如: o1ng uo2
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 17:45 2023/6/25
func PinYinStyleToneYunMuAtStart() PinYinArg {
return func(arg *pinyin.Args) {
arg.Style = pinyin.FinalsTone2
}
}
// PinYinStyleToneYunMuAtEnding 韵母风格3带声调声调在各个拼音之后用数字 [1-4] 进行表示。如: ong1 uo2
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 17:40 2023/6/25
func PinYinStyleToneYunMuAtEnding() PinYinArg {
return func(arg *pinyin.Args) {
arg.Style = pinyin.FinalsTone3
}
}
// 拼音风格设置结束
// PinYinStyleWithSeparator 设置拼音的分隔符
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 17:59 2023/6/25
func PinYinStyleWithSeparator(separator string) PinYinArg {
return func(arg *pinyin.Args) {
if len(separator) == 0 {
return
}
arg.Separator = separator
}
}
// PinYinStyleWithHeteronym 开启多音字模式
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 18:03 2023/6/25
func PinYinStyleWithHeteronym() PinYinArg {
return func(arg *pinyin.Args) {
arg.Heteronym = true
}
}
// PinYin 汉字转拼音
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 17:23 2023/6/25
type pinYin struct {
}
// Convert 汉字生成拼音
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 17:26 2023/6/25
func (py *pinYin) Convert(text string, argFuncList ...PinYinArg) string {
arg := pinyin.NewArgs()
arg.Separator = " "
for _, argFunc := range argFuncList {
argFunc(&arg)
}
return pinyin.Slug(text, arg)
}
// ConvertSingle 每个字一个读音, 支持多音字
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 18:02 2023/6/25
func (py *pinYin) ConvertSingle(text string, argFuncList ...PinYinArg) []string {
arg := pinyin.NewArgs()
arg.Separator = " "
for _, argFunc := range argFuncList {
argFunc(&arg)
}
return pinyin.LazyPinyin(text, arg)
}
// ConvertWithHeteronym 多音字模式
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 18:02 2023/6/25
func (py *pinYin) ConvertWithHeteronym(text string, argFuncList ...PinYinArg) [][]string {
arg := pinyin.NewArgs()
arg.Separator = " "
for _, argFunc := range argFuncList {
argFunc(&arg)
}
return pinyin.Pinyin(text, arg)
}