update go mod
This commit is contained in:
commit
55e14d3fd5
78
array.go
Normal file
78
array.go
Normal 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
21
array_test.go
Normal 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
33
browser.go
Normal 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
103
console.go
Normal 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
23
console_test.go
Normal 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
23
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
|
||||
}
|
||||
|
18
go.mod
18
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
|
||||
)
|
||||
|
29
go.sum
29
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=
|
||||
|
33
init.go
33
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{}
|
||||
}
|
||||
|
29
json.go
29
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<白茶清欢>
|
||||
|
66
jwt.go
Normal file
66
jwt.go
Normal 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
13
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)
|
||||
}
|
||||
|
12
project.go
12
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
|
||||
}
|
||||
|
29
string.go
29
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
|
||||
}
|
||||
|
653
string_convert.go
Normal file
653
string_convert.go
Normal 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
32
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")
|
||||
}
|
||||
|
176
user_agent.go
Normal file
176
user_agent.go
Normal 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
208
util.go
Normal 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)
|
||||
}
|
Loading…
Reference in New Issue
Block a user