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
	}

参考

[1] Swagger Download Document