Golang知识学习
参考资料
[toc]
Golang知识记录
基础
基础语法
近期任务
-
监听键盘输入
使用 github.com/eiannone/keyboard 库监听键盘的输入
-
获取键盘输入
使用fmt.Scanln获取输入的内容
-
打印二维码
使用go-qrcode库打印二维码
func RenderQrCodeString(s string) { q, err := qrcode.New(s, qrcode.Medium) if err != nil { log.Fatal(err) } fmt.Print(q.ToSmallString(false)) }
-
获取系统硬件参数
使用gopsutil库读取机器磁盘、cpu、内存网络等数据
-
touch命令
-
Go语言:sync.Once.Do
TIPS
- api不知道如何使用时
- 寻找官方示例
- 官方文档
- 查看源码
- 翻看其他教程
错误处理
//new一个error
errors.New("this is a new error")
golang 信号
wait := make(chan os.Signal, 1)
signal.Notify(wait, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM)
<-wait
//delete操作
err = consumer.Close()
使用场景:当需要停止程序时,按ctr+c、程序被kill、进程被终止时,则停止程序
- 可以用信号监听异常信息,并在程序中处理异常
原理:监听linux系统信号,若为SIGHUP、SIGINT、SIGTERM三种类型,则停止消费者程序。
各种信号含义如下:
-
SIGNUP
- 产生方式:进程被终止
-
SIGINT
- 产生方式: 键盘Ctrl+C
- 产生结果: 只对当前前台进程,和他的所在的进程组的每个进程都发送
SIGINT
信号,之后这些进程会执行信号处理程序再终止
-
SIGTERM
- 产生方式: 和任何控制字符无关,用kill函数发送
- 本质: 相当于shell> kill不加-9时 pid.
- 产生结果: 当前进程会收到信号,而其子进程不会收到.如果当前进程被kill(即收到SIGTERM),则其子进程的父进程将为init,即pid为1的进程. 与SIGKILL的不同: SIGTERM可以被阻塞,忽略,捕获,也就是说可以进行信号处理程序,那么这样就可以让进程很好的终止,允许清理和关闭文件.
-
SIGKILL
- 产生方式: 和任何控制字符无关,用kill函数发送
- 本质: 相当于shell> kill -9 pid.
- 产生结果: 当前进程收到该信号,注意该信号时无法被捕获的,也就是说进程无法执行信号处理程序,会直接发送默认行为,也就是直接退出.这也就是为何kill -9 pid一定能杀死程序的原因. 故这也造成了进程被结束前无法清理或者关闭资源等行为,这样是不好的.
-
各种信号总结如下
SIGHUP 终止进程 终端线路挂断 SIGINT 终止进程 中断进程 SIGQUIT 建立CORE文件终止进程,并且生成core文件 SIGILL 建立CORE文件 非法指令 SIGTRAP 建立CORE文件 跟踪自陷 SIGBUS 建立CORE文件 总线错误 SIGSEGV 建立CORE文件 段非法错误 SIGFPE 建立CORE文件 浮点异常 SIGIOT 建立CORE文件 执行I/O自陷 SIGKILL 终止进程 杀死进程 SIGPIPE 终止进程 向一个没有读进程的管道写数据 SIGALARM 终止进程 计时器到时 SIGTERM 终止进程 软件终止信号 SIGSTOP 停止进程 非终端来的停止信号 SIGTSTP 停止进程 终端来的停止信号 SIGCONT 忽略信号 继续执行一个停止的进程 SIGURG 忽略信号 I/O紧急信号 SIGIO 忽略信号 描述符上可以进行I/O SIGCHLD 忽略信号 当子进程停止或退出时通知父进程 SIGTTOU 停止进程 后台进程写终端 SIGTTIN 停止进程 后台进程读终端 SIGXGPU 终止进程 CPU时限超时 SIGXFSZ 终止进程 文件长度过长 SIGWINCH 忽略信号 窗口大小发生变化 SIGPROF 终止进程 统计分布图用计时器到时 SIGUSR1 终止进程 用户定义信号1 SIGUSR2 终止进程 用户定义信号2 SIGVTALRM 终止进程 虚拟计时器到时
数组
-
make([]int)
-
make([]int,0)
-
make([]int,0,100)
定时任务Ticker
守护进程的编写
-
supervisor作为守护进程
phyton编写,需要安装phyton环境
-
无需python环境,相较于python版本更为轻量
项目打包
-
Mac:
GOOS=darwin GOARCH=amd64 go build main.go
-
linux:
GOOS=linux GOARCH=amd64 go build main.go
项目规范
golang测试
-
基准测试
使用Benchmark开头
-
testintg.T 和testting.B的区别
常用框架
ORM框架
GORM
XORM
golang库收集
strings.trim使用
目标字符串拆分成多个字符,匹配到源字符串,挨个匹配并去除头尾匹配到的字符
示例代码如下:
import (
"fmt"
"strings"
)
func main(){
fmt.Println("[ !!! Achtung! Achtung! !!! ]:[]:[", strings.Trim(" !!! Achtung! Achtung! !!! ", "") ,"\b]")
fmt.Println("[ !!! Achtung! Achtung! !!! ]:[ ]:[", strings.Trim(" !!! Achtung! Achtung! !!! ", " ") ,"\b]")
fmt.Println("[ !!! Achtung! Achtung! !!! ]:[!]:[", strings.Trim(" !!! Achtung! Achtung! !!! ", "!") , "\b]")
fmt.Println("[ !!! Achtung! Achtung! !!! ]:[! ]:[", strings.Trim(" !!! Achtung! Achtung! !!! ", "! "), "\b]" )
fmt.Println(strings.Trim(" !!! Achtung! Achtung!!!!!", "!"))
fmt.Println(strings.Trim("a!!! Achtung! Achtunga!!!a!!a", "!a"))
}