From 773b3bb7833940c2e5b14fcd7ea8c9d953350d3c Mon Sep 17 00:00:00 2001 From: flyfish <290198252@qq.com> Date: Thu, 23 Jul 2020 17:52:13 +0800 Subject: [PATCH] =?UTF-8?q?=E6=97=A5=E5=BF=97=E5=A4=84=E7=90=86=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 11 ++++ logs/logs.go | 145 ++++++++++++++++++++++++++++++++++++++++++ network/net.go | 1 + utils/code_help.go | 36 +++++------ utils/utils.go | 20 +++--- 5 files changed, 186 insertions(+), 27 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 logs/logs.go diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..1779318 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,11 @@ +{ + "gopls": { + "usePlaceholders": true, + "completeUnimported": true + }, + "go.gopath": "D:/project/golang", + "go.goroot": "C:/GO", + "go.gotoSymbol.includeImports": true, + "go.inferGopath": true, + "go.gotoSymbol.includeGoroot": true, +} \ No newline at end of file diff --git a/logs/logs.go b/logs/logs.go new file mode 100644 index 0000000..9262b3f --- /dev/null +++ b/logs/logs.go @@ -0,0 +1,145 @@ +package logs + +import ( + "fmt" + "os" + "runtime" + "time" +) +const ( + LOG_ERROR = iota + LOG_WARING + LOG_INFO + LOG_DEBUG +) +var log *mylog +/* + * 初始化 + */ +func init() { + log = newMylog() +} + +func Init(dir string, file string, level int, savefile bool) { + log.setDir(dir) + log.setFile(file) + log.setLevel(level) + log.setSavefile(savefile) +} + +func Error(err ...interface{}) { + log.write(LOG_ERROR, fmt.Sprint(err...)) +} + +func Waring(war ...interface{}) { + log.write(LOG_WARING, fmt.Sprint(war...)) +} +func SetLevel(level int) { + log.setLevel(level) +} +func Info(info ...interface{}) { + log.write(LOG_INFO, fmt.Sprint(info...)) +} + +func Debug(deb ...interface{}) { + log.write(LOG_DEBUG, fmt.Sprint(deb...)) +} + +/* + * 日志执行函数 + */ +type mylog struct { + log chan string // 日志chan + dir string // 日志存放目录 + file string // 日志文件名 + savefile bool // 是否保存到文件 + level int // 日志级别 + saveTime time.Time // 上次保存时间 +} + +func newMylog() *mylog { + log := &mylog{} + + log.log = make(chan string, 100) + log.dir = "/opt/logs" + log.file = "out" + log.savefile = false + + go log.run() + return log +} + +func (l *mylog) setDir(dir string) { + l.dir = dir +} + +func (l *mylog) setFile(file string) { + l.file = file +} + +func (l *mylog) setSavefile(b bool) { + l.savefile = b +} + +func (l *mylog) setLevel(level int) { + l.level = level +} + +func (l *mylog) getLevelString(level int) string { + switch level { + case LOG_ERROR: + return "ERROR" + case LOG_WARING: + return "WARING" + case LOG_INFO: + return "INFO" + case LOG_DEBUG: + return "DEBUG" + } + + return "unknown" +} + +func (l *mylog) write(level int, str string) { + // 判断级别 + if level > l.level { + return + } + + // 输出日志 + pc, _, line, _ := runtime.Caller(2) + p := runtime.FuncForPC(pc) + t := time.Now() + str = fmt.Sprintf("[%04d-%02d-%02d %02d:%02d:%02d] [%s] %s(%d): %s\n", + t.Year(), t.Month(), t.Day(), t.Hour(), t.Minute(), t.Second(), + l.getLevelString(level), p.Name(), line, str) + // 输出到控制台 + if false == l.savefile { + fmt.Print(str) + return + } + + // 输出到文件 + l.log <- str +} + +func (l *mylog) run() { + for { + str := <-l.log + + // 判断文件夹是否存在 + _, err := os.Stat(l.dir) + if nil != err { + os.MkdirAll(l.dir, os.ModePerm) + } + // 获取时间 + t := time.Now() + path := fmt.Sprintf("%s/%s-%04d-%02d-%02d.log", l.dir, l.file, + t.Year(), t.Month(), t.Day()) + fp, err := os.OpenFile(path, os.O_WRONLY|os.O_APPEND|os.O_CREATE, os.ModePerm) + if nil == err { + fp.WriteString(str) + fp.Close() + } + } +} diff --git a/network/net.go b/network/net.go index c4b256a..f98c3af 100644 --- a/network/net.go +++ b/network/net.go @@ -36,6 +36,7 @@ func HttpPut(url string,ct string,dat []byte,timeout time.Duration) ([]byte,erro body, er := ioutil.ReadAll(res.Body) return body,er } + func HttpPost(url string,ct string,headers map[string] string, dat []byte,timeout time.Duration) ([]byte,error) { req, _ := http.NewRequest("POST", url, bytes.NewReader(dat)) req.Header.Add("Content-Type", ct) diff --git a/utils/code_help.go b/utils/code_help.go index 8c2cb7c..58d52ee 100644 --- a/utils/code_help.go +++ b/utils/code_help.go @@ -1,14 +1,14 @@ -package go_utils +package utils import ( - "reflect" - "strings" "encoding/json" "log" + "reflect" + "strings" ) // 驼峰转蛇形 - func ToSnakeString(s string) string { +func ToSnakeString(s string) string { data := make([]byte, 0, len(s)*2) j := false num := len(s) @@ -23,6 +23,7 @@ import ( data = append(data, d) } return strings.ToLower(string(data[:])) + } // 蛇形转驼峰 @@ -50,39 +51,38 @@ func ToCamelString(s string) string { return string(data[:]) } - //递归的语义化分析 // todo 目前只做单层,以后支持多层 -func GetStructCodeFromJson(s string,structName string) string { +func GetStructCodeFromJson(s string, structName string) string { gencode := "type " + structName + " struct {\r\n" dat := map[string]interface{}{} - e := json.Unmarshal([]byte(s),&dat) - if nil != e{ + e := json.Unmarshal([]byte(s), &dat) + if nil != e { log.Print(e.Error()) return "" } - for k,v := range dat{ - log.Print(k , " ",reflect.TypeOf(v).Kind().String()) + for k, v := range dat { + log.Print(k, " ", reflect.TypeOf(v).Kind().String()) //如果是切片,切片类型 - if reflect.TypeOf(v).Kind() == reflect.Slice{ - gencode += " " + ToCamelString(k) + " " + reflect.TypeOf(v).Kind().String() + " `json:\"" + k + "\"` \r\n" - log.Print(reflect.ValueOf(v).Slice(0,0).Kind()) + if reflect.TypeOf(v).Kind() == reflect.Slice { + gencode += " " + ToCamelString(k) + " " + reflect.TypeOf(v).Kind().String() + " `json:\"" + k + "\"` \r\n" + log.Print(reflect.ValueOf(v).Slice(0, 0).Kind()) //reflect.ValueOf(v).Slice(0,1) // todo 先暂时用interface代替 continue } // 如果是字典 - if reflect.TypeOf(v).Kind() == reflect.Map{ - gencode += " " + ToCamelString(k) + " map[string]interface{} " + " `json:\"" + k + "\"` \r\n" + if reflect.TypeOf(v).Kind() == reflect.Map { + gencode += " " + ToCamelString(k) + " map[string]interface{} " + " `json:\"" + k + "\"` \r\n" - for _ ,v := range reflect.ValueOf(v).MapKeys(){ + for _, v := range reflect.ValueOf(v).MapKeys() { log.Print(v) } continue } - gencode += " " + ToCamelString(k) + " " + reflect.TypeOf(v).Kind().String() + " `json:\"" + k + "\"` \r\n" + gencode += " " + ToCamelString(k) + " " + reflect.TypeOf(v).Kind().String() + " `json:\"" + k + "\"` \r\n" // 基础类型直接加代码 } gencode += "}" return gencode -} \ No newline at end of file +} diff --git a/utils/utils.go b/utils/utils.go index f6f5588..6f6b7fd 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -8,31 +8,33 @@ import ( ) // GetMd5ToLow Md5加密小写 -func GetMd5ToLow(str string) string { +func GetMd5ToLow(str string) string { + m := md5.New() m.Write([]byte(str)) result := hex.EncodeToString(m.Sum(nil)) result = strings.ToLower(result) return result } + // InArrary 是否在数组 -func InArrary(arr interface{},ele interface{}) int{ - if reflect.TypeOf(arr).Kind() != reflect.Slice && reflect.TypeOf(arr).Kind() != reflect.Array{ +func InArrary(arr interface{}, ele interface{}) int { + if reflect.TypeOf(arr).Kind() != reflect.Slice && reflect.TypeOf(arr).Kind() != reflect.Array { return -1 } //数组为空 - if reflect.ValueOf(arr).Len() == 0{ - return 1 + if reflect.ValueOf(arr).Len() == 0 { + return 1 } // 数组和元素不一致 if reflect.ValueOf(arr).Index(0).Type().Kind() != reflect.TypeOf(ele).Kind() { - return 1 + return 1 } - for i := 0; i < reflect.ValueOf(arr).Len();i ++ { + for i := 0; i < reflect.ValueOf(arr).Len(); i++ { if reflect.ValueOf(arr).Index(i).Interface() == - reflect.ValueOf(ele).Interface(){ + reflect.ValueOf(ele).Interface() { return 0 } } return 1 -} \ No newline at end of file +}