首页
关于
友链
统计
更多
留言
Search
1
centos7下源码编译安装Lnmp环境
492 阅读
2
Centos 8 安装samba服务
435 阅读
3
golang库-GoCV
309 阅读
4
Golang 通用后台权限管理系统 (Go-Funny-CMS)
243 阅读
5
nginx、apache启用HSTS
211 阅读
其他
前端
JavaScript
后端
Linux
PHP
golang
登录
Search
标签搜索
linux
php
golang
golang库
github
加速器
mysql
nginx
apache
lnmp
虚拟内存
JavaScript
nodejs
redis
流星Aday
累计撰写
14
篇文章
累计收到
0
条评论
首页
栏目
其他
前端
JavaScript
后端
Linux
PHP
golang
页面
关于
友链
统计
留言
搜索到
4
篇与
golang
的结果
2021-10-27
记一些工作常用的工具包函数——golang
//ReverseString 反转字符串 func ReverseString(s string) string { runes := []rune(s) for from, to := 0, len(runes)-1; from < to; from, to = from+1, to-1 { runes[from], runes[to] = runes[to], runes[from] } return string(runes) } //Exists 判断文件存在 func Exists(path string) bool { _, e := os.Stat(path) return e == nil || os.IsExist(e) } //ShellExec 运行命令 func ShellExec(command string, arg ...string) (string, error) { var builder strings.Builder _, _ = builder.WriteString(command) for _, v := range arg { _, _ = builder.WriteString(" ") _, _ = builder.WriteString(v) } stdOut, stdErr, e := RunCmdAndGetOutput(exec.Command("/bin/bash", "-c", builder.String())) if e != nil { e = errors.New(stdErr) } return stdOut, e } //ShellExecBackends 后台运行命令 func ShellExecBackends(command string, arg ...string) error { var builder strings.Builder _, _ = builder.WriteString(command) for _, v := range arg { _, _ = builder.WriteString(" ") _, _ = builder.WriteString(v) } cmd := exec.Command("/bin/bash", "-c", builder.String()) if e := cmd.Start(); e != nil { return gerror.Wrap(e, "ShellExecBackends") } go cmd.Wait() //避免僵尸进程 return nil } //PostFormRequest post表单请求,超时30s //url 请求api //data 数据 //ssl 是否关闭ssl,true关闭 func PostFormRequest(url string, data url.Values, ssl bool) ([]byte, error) { client := &http.Client{ Transport: &http.Transport{ TLSClientConfig: &tls.Config{InsecureSkipVerify: ssl}, }, } client.Timeout = time.Second * 30 form, err := client.PostForm(url, data) if err != nil { return nil, gerror.Wrap(err, "PostFormRequest") } defer form.Body.Close() res, err := io.ReadAll(form.Body) if err != nil { return nil, gerror.Wrap(err, "PostFormRequest1") } return res, nil } //GetRequest get请求 //url 请求api //header 请求头 //ssl 是否关闭ssl,true关闭 func GetRequest(url string, header http.Header, ssl bool) ([]byte, error) { request, err := http.NewRequest("GET", url, nil) if err != nil { return nil, gerror.Wrap(err, "GetRequest") } client := &http.Client{ Transport: &http.Transport{ TLSClientConfig: &tls.Config{InsecureSkipVerify: ssl}, }, } request.Header = header response, err := client.Do(request) if err != nil { return nil, gerror.Wrap(err, "GetRequest1") } defer response.Body.Close() res, err := io.ReadAll(response.Body) if err != nil { return nil, gerror.Wrap(err, "GetRequest2") } return res, nil } //GetStringMd5 计算字符串md5 func GetStringMd5(str string) string { h := md5.New() _, _ = h.Write([]byte(str)) return hex.EncodeToString(h.Sum(nil)) } //GetFileMd5 计算文件md5 func GetFileMd5(file string) (string, error) { f, err := os.Open(file) if err != nil { return "", err } defer f.Close() hash := md5.New() if _, err = io.Copy(hash, f); err != nil { return "", err } return hex.EncodeToString(hash.Sum(nil)[:16]), nil } //WatchFile 监听文件修改 func WatchFile(file string, fn func()) { //创建一个监控对象 watcher, err := fsnotify.NewWatcher() if err != nil { logrus.Warning("WatchFile:", err) return } if err = watcher.Add(file); err != nil { logrus.Warning("WatchFile1:", err) return } //启动一个协和监听config是否被修改 go func() { ch := make(chan os.Signal, 1) signal.Notify(ch, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGHUP) <-ch _ = watcher.Close() }() //另启一个goroutine来处理监控对象的事件 go func() { for { select { case event, ok := <-watcher.Events: if !ok { return } if event.Op&fsnotify.Write == fsnotify.Write { fn() } case err, ok := <-watcher.Errors: if !ok { return } logrus.Warning("WatchFile2:", err) } } }() } //SwitchUserRight 切换到指定用户权限(用户及组)仅对文件操作生效,会影响当前协程的向下执行逻辑及所有子函数 //切换时注意需权限控制的异步io是否运行完毕,否则可能会才出现权限问题 //name 为空则切换回程序执行用户 func SwitchUserRight(name ...string) error { var uid, gid int var userInfo *user.User if len(name) == 0 { u, e := user.Current() if e != nil { return gerror.Wrap(e, "SwitchUserRight1") } userInfo = u } else { u, e := user.Lookup(name[0]) if e != nil { return gerror.Wrap(e, "SwitchUserRight2") } userInfo = u } gid, e := strconv.Atoi(userInfo.Gid) if e != nil { return gerror.Wrap(e, "SwitchUserRight3") } uid, e = strconv.Atoi(userInfo.Uid) if e != nil { return gerror.Wrap(e, "SwitchUserRight4") } if e = syscall.Setfsgid(gid); e != nil { return gerror.Wrap(e, "conversion failure1") } if e = syscall.Setfsuid(uid); e != nil { return gerror.Wrap(e, "conversion failure2") } return nil } //CheckPort 检测端口是否占用 //return true被占用 false未被占用 func CheckPort(port uint16) (bool, error) { conn, err := net.DialTimeout("tcp", fmt.Sprintf("0.0.0.0:%d", port), 3*time.Second) if err != nil { return false, nil } _ = conn.Close() return true, nil } func main() { //接收参数 daemon := flag.Bool("D", false, "Run in daemon mode") flag.Parse() //后台运行 if *daemon && os.Getppid() != 1 { //判断当其是否是子进程,当父进程return之后,子进程会被系统1号进程接管 filePath, err := filepath.Abs(os.Args[0]) if err != nil { log.Fatalln(err) } cmd := exec.Command(filePath) cmd.Stdin = nil cmd.Stdout = nil cmd.Stderr = nil if err = cmd.Start(); err != nil { log.Fatalln(err) } return } //监听进程信号,优雅退出 go func() { ch := make(chan os.Signal, 1) signal.Notify(ch, unix.SIGINT, unix.SIGTERM, unix.SIGQUIT, unix.SIGHUP) <-ch os.Exit(0) }() } //FileSizeFriendly 文件大小人性化 //size单位B func FileSizeFriendly(size int64) string { if size < 1024 { return fmt.Sprintf("%.2fB", float64(size)) } if size < (1024 * 1024) { return fmt.Sprintf("%.2fKB", float64(size)/float64(1024)) } if size < (1024 * 1024 * 1024) { return fmt.Sprintf("%.2fMB", float64(size)/float64(1024*1024)) } if size < (1024 * 1024 * 1024 * 1024) { return fmt.Sprintf("%.2fGB", float64(size)/float64(1024*1024*1024)) } if size < (1024 * 1024 * 1024 * 1024 * 1024) { return fmt.Sprintf("%.2fTB", float64(size)/float64(1024*1024*1024*1024)) } return fmt.Sprintf("%.2fEB", float64(size)/float64(1024*1024*1024*1024*1024)) }
2021年10月27日
125 阅读
0 评论
4 点赞
2021-08-24
golang调试工具-delve
安装Windowsgo get github.com/go-delve/delve/cmd/dlv安装目录为GOPATH/bin/dlv直接在cmd运行dlv可查询参数信息linuxgo get github.com/go-delve/delve/cmd/dlv安装目录为$GOPATH/bin/dlv如果是root用户使用可以直接运行ln -s /root/go/bin/dlv /usr/local/bin/添加为环境变量不为root用户则修改~/.bashrc或者/etc/profile,末尾添加export PATH="$GOPATH/bin/dlv"保存,运行source ~/.bashrc或者source /etc/profile刷新环境变量使用配置gland,步骤如下:输入监听端口和目标ip,点击确定。使用dlv debug --listen 2345 --api-version 2 ./main.go
2021年08月24日
182 阅读
0 评论
4 点赞
2021-06-20
Golang 通用后台权限管理系统 (Go-Funny-CMS)
Golang 通用后台权限管理系统 (Go-Funny-CMS)线上地址演示https://admin-go.surest.cn 账号: surest 密码: 123456预览项目地址前端项目: https://github.com/Lets-Go-together/go-funny-cms-front后端项目: https://github.com/Lets-Go-together/go-funny-cms项目简介是一个简单版本使用 Casbin + Golang 开发的通用后台权限管理系统项目结构参考了Laravel初始化目录结构,更加便于 phper 进行开发和学习目前采用的技术栈如下golanggingorm(等)vue + design-vuecasbin采用前后端分离的开发方式快速安装#后端项目 https://github.com/Lets-Go-together/go-funny-cms.git cd go-funny-cms #导入sql: backups/funy_cms_20210514_153117.sql.gz cp .env .env.example go run main.go #或者 air #前端项目 https://github.com/Lets-Go-together/go-funny-cms-front.git cd go-funny-cms-front yarn install npm run dev配置邮件发送#后台运行 go run main.go express-run额外命令参考pkg/command/command.go目前支持功能后台账号管理用户权限控制自动权限路由生成RABC + ABC权限控制自定义控制菜单栏邮件发送与处理目录结构目前此系统未集成什么功能,非常便于二次开发进行,目录结构清晰- app :应用模块 (在次同级别目录,你可以同样创建app2目录) - http :api 接口操作相关 - admin : 根据应用内模块区分 - controler : 控制器层 - validate : 关于reuqest 和 验证器都走这里 - index : 例如客户端api 模块 - 同上... - middleware : 用于中间件管理(可参考api 中间件的使用) - models : 模型 - service: 字如其名 (service层) - validates: 验证器的二次封装 - ... 中间的没什么好介绍的 - pkg : 自定义创建的一些包,便于二次开发和提取我的未来由于时间的关系或者我个人的关系,需要去做一些更重要更值得做的事情,所以就草草的收尾了这个项目,欢迎提出有趣的想法和见解,我们一起来个思想碰撞,我也在致力于做一些自己的产品。以上这个项目,如果有有趣的想法,欢迎一起讨论,再基础上继续开发我们都"不止于此" ~转发来自于:邓尘锋的博客
2021年06月20日
243 阅读
0 评论
7 点赞
2021-06-06
golang库-GoCV
{callout color="#f0ad4e"}简介:GoCV是go语言版的OpenCV封装,基于opencv4.0+,OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉和机器学习软件库。{/callout}Linux上安装GoCVlinux系统建议使用ubuntu来安装gocv,使用centos会出现一堆依赖问题。需先安装go环境wget -c https://golang.google.cn/dl/go1.16.5.linux-amd64.tar.gz tar -C /usr/local -zxvf go1.16.5.linux-amd64.tar.gz ln -s /usr/local/go/bin /usr/bin/go go version安装GoCVgo get -u -d gocv.io/x/gocv cd $GOPATH/src/gocv.io/x/gocv make install #编译,有点久可能需要1小时完成安装成功后输出如下gocv version: 0.27.0 opencv lib version: 4.5.2简单使用(图像人脸识别)package main import ( "fmt" "gocv.io/x/gocv" "log" "time" ) func main() { //打开图片文件,如果参数是string类型文件路径则打开文件,参数是int类型设备id则打开设备 webcam, e := gocv.OpenVideoCapture("img/2.JPG") if e != nil { log.Fatal(e) } defer webcam.Close() //创建级联分类器 classifier := gocv.NewCascadeClassifier() defer classifier.Close() //载入级联分类器配置 if !classifier.Load("data/haarcascade_frontalface_default.xml") { log.Fatal("load the failure") } //创建一个空的mat img := gocv.NewMat() defer img.Close() //读取图像的下一帧,如果图像有多帧可使用for循环读取,webcam.Grab()跳过特定帧 if !webcam.Read(&img) { log.Fatal("failed to read image") } //识别人脸位置,返回切片,每个切片值为矩形坐标x,y,人脸数量等于len(rects) rects := classifier.DetectMultiScale(img) fmt.Printf("found %d faces\n", len(rects)) for _, v := range rects { //读取人脸坐标信息,剪切图像另存文件 _ = gocv.IMWrite(fmt.Sprintf("img/%d.jpg", time.Now().UnixNano()), img.Region(v)) } }
2021年06月06日
309 阅读
0 评论
8 点赞