// Copyright 2018 ouqiang authors // // Licensed under the Apache License, Version 2.0 (the "License"): you may // not use this file except in compliance with the License. You may obtain // a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations // under the License. package goutil import ( "bytes" "crypto/md5" "encoding/hex" "fmt" "html/template" "io" "math/rand" "net/http" "os" "path" "path/filepath" "runtime" "time" ) // MD5 生成MD5摘要 func MD5(s string) string { m := md5.New() m.Write([]byte(s)) return hex.EncodeToString(m.Sum(nil)) } // RandNumber 生成min - max之间的随机数 func RandNumber(min, max int) int { r := rand.New(rand.NewSource(time.Now().UnixNano())) return min + r.Intn(max-min) } // PanicToError Panic转换为error func PanicToError(f func()) (err error) { defer func() { if e := recover(); e != nil { err = fmt.Errorf("panic: %s", e) } }() f() return } // PrintAppVersion 打印应用版本 func PrintAppVersion(appVersion, GitCommit, BuildDate string) { versionInfo, err := FormatAppVersion(appVersion, GitCommit, BuildDate) if err != nil { panic(err) } fmt.Println(versionInfo) } // FormatAppVersion 格式化应用版本信息 func FormatAppVersion(appVersion, GitCommit, BuildDate string) (string, error) { content := ` Version: {{.Version}} Go Version: {{.GoVersion}} Git Commit: {{.GitCommit}} Built: {{.BuildDate}} OS/ARCH: {{.GOOS}}/{{.GOARCH}} ` tpl, err := template.New("version").Parse(content) if err != nil { return "", err } var buf bytes.Buffer err = tpl.Execute(&buf, map[string]string{ "Version": appVersion, "GoVersion": runtime.Version(), "GitCommit": GitCommit, "BuildDate": BuildDate, "GOOS": runtime.GOOS, "GOARCH": runtime.GOARCH, }) if err != nil { return "", err } return buf.String(), err } // DownloadFile 文件下载 func DownloadFile(filePath string, rw http.ResponseWriter) error { file, err := os.Open(filePath) if err != nil { return err } filename := path.Base(filePath) rw.Header().Set("Content-Type", "application/octet-stream") rw.Header().Set("Content-Disposition", fmt.Sprintf(`attachment; filename="%s"`, filename)) _, err = io.Copy(rw, file) return err } // WorkDir 获取程序运行时根目录 func WorkDir() (string, error) { execPath, err := os.Executable() if err != nil { return "", err } wd := filepath.Dir(execPath) if filepath.Base(wd) == "bin" { wd = filepath.Dir(wd) } return wd, nil }