diff --git a/array.go b/array.go new file mode 100644 index 0000000..91c751b --- /dev/null +++ b/array.go @@ -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) +} diff --git a/array_test.go b/array_test.go new file mode 100644 index 0000000..8cb0110 --- /dev/null +++ b/array_test.go @@ -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})) +} diff --git a/browser.go b/browser.go new file mode 100644 index 0000000..30c22c8 --- /dev/null +++ b/browser.go @@ -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() +} diff --git a/console.go b/console.go new file mode 100644 index 0000000..e6faafd --- /dev/null +++ b/console.go @@ -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) + } +} diff --git a/console_test.go b/console_test.go new file mode 100644 index 0000000..732ead1 --- /dev/null +++ b/console_test.go @@ -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) +} diff --git a/file.go b/file.go index 41c0caf..16a0e79 100644 --- a/file.go +++ b/file.go @@ -9,6 +9,7 @@ package util import ( "io/ioutil" + "net/http" "os" "strings" @@ -156,3 +157,25 @@ func (f *file) IsFileExist(filePath string) (bool, bool) { fileStat, err := os.Stat(filePath) 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 +} diff --git a/go.mod b/go.mod index cc0cdb0..9000567 100644 --- a/go.mod +++ b/go.mod @@ -1,21 +1,27 @@ module git.zhangdeman.cn/zhangdeman/util -go 1.17 +go 1.20 require ( github.com/Jeffail/gabs v1.4.0 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/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 ) require ( github.com/blang/semver v3.5.1+incompatible // indirect - github.com/stretchr/testify v1.8.0 // indirect - github.com/tebeka/selenium v0.9.9 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // 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 ) diff --git a/go.sum b/go.sum index aa5f9b1..17218fd 100644 --- a/go.sum +++ b/go.sum @@ -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.41.0/go.mod h1:OauMR7DV8fzvZIl2qg6rkaIhD/vmgk4iwEw/h6ercmg= 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/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/Jeffail/gabs v1.4.0 h1://5fYRRTq1edjfIrQGvdkcd22pkYUrHZ5YC/H2GJVAo= 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/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= @@ -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.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 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/go-ini/ini v1.66.6/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= +github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= +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/mock v1.1.1/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 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.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= 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-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.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/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/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 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/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.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.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.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/go.mod h1:5Fr8+pUvU6B1OiPfkdCKdXZyr5znvVkxuPd0NOdZCQc= -github.com/tidwall/gjson v1.14.1 h1:iymTbGkQBhveq21bEvAQ81I0LEBork8BFe1CUZXdyuo= -github.com/tidwall/gjson v1.14.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM= +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/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.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.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= 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-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-20190620200207-3b0461eec859 h1:R/3boaszxrf1GEUWTVDzSKVwLmSJpwZ1yqXm8j0v2QI= 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-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= diff --git a/init.go b/init.go index 7f78400..68b7fd9 100644 --- a/init.go +++ b/init.go @@ -31,7 +31,21 @@ var ( // Calculate ... Calculate *calculate // 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() { @@ -46,4 +60,21 @@ func init() { URL = &ownURL{} Map = &ownMap{} 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{} } diff --git a/json.go b/json.go index c360d40..26e8fdb 100644 --- a/json.go +++ b/json.go @@ -46,6 +46,35 @@ func (oj *ownJSON) UnmarshalWithNumberForIOReader(ioReader io.ReadCloser, receiv 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 ... // // Author : go_developer@163.com<白茶清欢> diff --git a/jwt.go b/jwt.go new file mode 100644 index 0000000..5a03731 --- /dev/null +++ b/jwt.go @@ -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 +} diff --git a/map.go b/map.go index 0c65279..d60d5ed 100644 --- a/map.go +++ b/map.go @@ -214,3 +214,16 @@ func (om *ownMap) GetDataWithReceiver(source map[interface{}]interface{}, key in } 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) +} diff --git a/project.go b/project.go index 8f1c610..edf49f0 100644 --- a/project.go +++ b/project.go @@ -12,6 +12,8 @@ import ( "path/filepath" "runtime" "strings" + + "github.com/mitchellh/go-homedir" ) type project struct { @@ -88,3 +90,13 @@ func (p *project) GetProjectPath() string { dir, _ := os.Getwd() return dir } + +// GetHomeDir 获取家目录 +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 22:31 2023/4/18 +func (p *project) GetHomeDir() string { + homePath, _ := homedir.Dir() + return homePath +} diff --git a/string.go b/string.go index d62cb1a..dd76bcb 100644 --- a/string.go +++ b/string.go @@ -17,6 +17,14 @@ import ( "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 ... // // Author : go_developer@163.com<白茶清欢> @@ -172,3 +180,24 @@ func (s *stringOperate) ClearChar(src string, charList ...string) string { } 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 +} diff --git a/string_convert.go b/string_convert.go new file mode 100644 index 0000000..3ac30ee --- /dev/null +++ b/string_convert.go @@ -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...) +} diff --git a/time.go b/time.go index 69741bc..ac11065 100644 --- a/time.go +++ b/time.go @@ -18,6 +18,7 @@ import ( // // Date : 15:24 2022/5/14 type ownTime struct { + format string } // GetCurrentFormatTime 获取当前时间的格式化时间(秒) @@ -25,8 +26,11 @@ type ownTime struct { // Author : go_developer@163.com<白茶清欢> // // Date : 1:34 上午 2021/10/7 -func (ot *ownTime) GetCurrentFormatTime() string { - return time.Now().Format("2006-01-02 15:04:05") +func (ot *ownTime) GetCurrentFormatTime(layout ...string) string { + if len(layout) == 0 { + layout = []string{"2006-01-02 15:04:05"} + } + return time.Now().In(time.Local).Format(layout[0]) } // FormatUnixNano 格式化纳秒时间戳 @@ -34,10 +38,13 @@ func (ot *ownTime) GetCurrentFormatTime() string { // Author : go_developer@163.com<白茶清欢> // // 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 milli := timestamp / 1e6 - return ot.FormatUnixMilli(milli) + fmt.Sprintf(" %v", nano) + return ot.FormatUnixMilli(milli, layout...) + fmt.Sprintf(" %v", nano) } // FormatUnixMilli 格式化毫秒时间戳 @@ -45,9 +52,11 @@ func (ot *ownTime) FormatUnixNano(timestamp int64) string { // Author : go_developer@163.com<白茶清欢> // // Date : 11:55 2022/7/14 -func (ot *ownTime) FormatUnixMilli(timestamp int64) string { - time.Now().UnixMilli() - return time.UnixMilli(timestamp).Format("2006-01-02 15:04:05.000") +func (ot *ownTime) FormatUnixMilli(timestamp int64, layout ...string) string { + if len(layout) == 0 { + layout = []string{"2006-01-02 15:04:05.000"} + } + return time.UnixMilli(timestamp).In(time.Local).Format(layout[0]) } // FormatUnixSec ... @@ -55,8 +64,11 @@ func (ot *ownTime) FormatUnixMilli(timestamp int64) string { // Author : go_developer@163.com<白茶清欢> // // Date : 12:06 2022/7/14 -func (ot *ownTime) FormatUnixSec(timestamp int64) string { - return time.UnixMilli(timestamp).Format("2006-01-02 15:04:05") +func (ot *ownTime) FormatUnixSec(timestamp int64, layout ...string) string { + 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 @@ -75,5 +87,5 @@ func (ot *ownTime) ParseISO8601Time(parseTime string) string { return "" } - return formatTime.Format("2006-01-02 15:04:05") + return formatTime.In(time.Local).Format("2006-01-02 15:04:05") } diff --git a/user_agent.go b/user_agent.go new file mode 100644 index 0000000..4873f89 --- /dev/null +++ b/user_agent.go @@ -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"` // 操作系统版本 +} diff --git a/util.go b/util.go new file mode 100644 index 0000000..4c08359 --- /dev/null +++ b/util.go @@ -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) +}