golang - advancevillage/demo GitHub Wiki
概述
代码开发规范
一 代码层面
1: example/
|--- model..go //定义表结构、常量
|--- dao/
| |--- example_dao.go
| |--- //文件命名要求:
| // 1: 全小写
| // 2: 单词间使用下划线连接
|--- service/
|--- example_service.go
2: 函数写注释
//@breif: 函数功能概述
//@param: ..
//@param: ..
//@retval: 返回类型和值说明
//@note: 特别需要注意的地方
func f() error {} //函数至少返回类型 error
3: 创建函数关键字使用
- Create 创建/新建
- Update 编辑/修改
- Delete 删除
- Query 查找/搜索
- Verify 认证
- Increase 增加
- Decrease 减少
4: 接口文档Swagger
- swag 1.6.2
$ swag init -g src/main/main.go
5: 必须有对应的单元测试
- example.go
- example_test.go
坑
一 Go语言中Kill子进程
//@link: https://www.jianshu.com/p/1f3ec2f00b03
func main() {
cmd := exec.Command("/bin/sh", "-c", "watch date > date.txt")
start := time.Now()
time.AfterFunc(3*time.Second, func() { cmd.Process.Kill() })
err := cmd.Run()
fmt.Printf("pid=%d duration=%s err=%s\n", cmd.Process.Pid, time.Since(start), err)
} ❌
func main() {
cmd := exec.Command("/bin/sh", "-c", "watch date > date.txt")
// Go会将PGID设置成与PID相同的值
cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true} //pgid = pid
start := time.Now()
time.AfterFunc(3*time.Second, func() { syscall.Kill(-cmd.Process.Pid, syscall.SIGKILL) })
err := cmd.Run()
fmt.Printf("pid=%d duration=%s err=%s\n", cmd.Process.Pid, time.Since(start), err)
}👌
发送加密邮件
func SendMailUsingTLS(host string, port int, auth smtp.Auth, from string,to []string, msg []byte) (err error) {
//创建TLS 加密链接
conn , err := tls.Dial("tcp", fmt.Sprintf("%s:%d", host, port), nil)
if err != nil {
return err
}
//基于加密链接创建smtp客户端
client, err := smtp.NewClient(conn, host)
if err != nil {
return err
}
//校验smtp客户端
if auth != nil {
if ok, _ := client.Extension("AUTH"); ok {
if err = client.Auth(auth); err != nil {
//关闭Smtp客户端连接
_ = client.Close()
return err
}
}
} else {
//关闭Smtp客户端连接
_ = client.Close()
return errors.New("auth is nil")
}
//设置发件人
if err = client.Mail(from); err != nil {
_ = client.Close()
return err
}
//设置收件人
for i := range to {
if err = client.Rcpt(to[i]); err != nil {
_ = client.Close()
return err
}
}
//设置邮件协议内容
w, err := client.Data()
if err != nil {
_ = client.Close()
return err
}
_, err = w.Write(msg)
if err != nil {
_ = client.Close()
return err
}
err = w.Close()
if err != nil {
_ = client.Close()
return err
}
//停止连接
return client.Quit()
}
HTTP请求方式
//....
client := &http.Client{Timeout: time.Second * 10}
request, err := http.NewRequest(http.MethodGet, uri, nil)
if err != nil {
return err
}
//设置请求参数
query := request.URL.Query()
for k,v := range params {
query.Add(k, v)
}
request.URL.RawQuery = query.Encode()
//设置请求头 headers > service.Configure.Header
for k,v := range headers {
request.Header.Add(k,v)
}
//发送请求
response, err := client.Do(request)
if err != nil {
return err
}
defer func() { err = response.Body.Close() }()
//读取响应
body, err := ioutil.ReadAll(response.Body)
if err != nil {
return err
}