Golang知识记录

Posted by zengchengjie on Tuesday, October 12, 2021

Golang知识学习

参考资料

Go 语言实战: 编写可维护 Go 语言代码建议

[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环境

  • golang版本的supervisor

    无需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的区别

golang-standards

代码规范相关博客

常用框架

ORM框架

GORM

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"))

}