1、Go微服务-前置准备

前言

  • 微服务的环境需要安装较多的软件,甚至环境就可以卡掉很多同学,这里特意整合一篇关于环境搭建的
  • 在项目开发前介绍下包的常识
  • 在项目开发前统一一下go的编码规范

一、环境搭建汇总

随着后续的沉淀会陆续补充


二、GOPATH和GoModules比较

1 - GOPATH项目

  • go1.12之前新建项目GOPATH方式:需要建立在GOPATH的src目录,否则会有问题
    在这里插入图片描述
  • GOPATH方式需要关闭Go modulesgo env -w GO111MODULE=off
  • GOPATH方式的包查找顺序
    • 先查找GOPATH/src目录下是否有import的包
    • 再查找GOROOT/src目录下是否有import的包
  • GOPATH方式的项目总结
    • 一定要将代码新建到GOPATH目录之下src
    • 需要将GO111MODULE设置为off

2 - GoModules项目

  • GoModules方式需要开启Go modulesgo env -w GO111MODULE=on
  • GoModules方式对项目的目录没有要求:只要有go.mod即可
    在这里插入图片描述
  • go.mod可以指定包的版本号
    在这里插入图片描述

三、go编码规范

1 - 命名规范

  • 当命名以大写字母开头:当命名(包括常量、变量、类型、函数名、结构字段等等)以一个大写字母开头,如Group1,那么使用这种形式的标识符的对象就可以被外部包的代码所使用(客户端程序需要先导入这个包),这被称为导出(像面向对象语言中的public)
  • 当命名以小写字母开头:当命名以小写字母开头,则对包外是不可见的,但是他们在整个包的内部是可见并且可用的(像面向对象语言中的private)
  • 包名package规范:保持package的名字和目录保持一致,尽量采取有意义的包名,简短有意义,尽量和标准库不要冲突;包名应该为小写单词,不要使用下划线或者混合大小写package modelpackage main
  • 文件名规范:尽量采取有意义的文件名,简短有意义,应该为小写字母,使用下划线分隔各个单词user_model.go
  • 结构体命名:采用驼峰命名法,首字母根据访问控制大写或小写;struct声明和初始化采用多行
package main

import "fmt"

type User struct {
	UserName string
	Email    string
}

func main() {
	u := User{
		UserName: "tom",
		Email:    "cat",
	}
	fmt.Println(u.UserName)
}
  • 接口命名规范:命名规则基本和结构体类型差不多;单个函数的结构名以er作为后缀,例如Reader、Writer
type Reader interface {
	Read(p []byte) (n int, err error)
}
  • 变量命名
    • 和结构体类似,变量名一般遵循驼峰法,首字母根据访问控制原则大写或者小写
    • 但遇到特有名词时,需要遵循以下规则
      • 如果变量为私有,且特有名词为首个单词,则使用小写,如apiClient
      • 其他情况都应该使用该名词原有的写法,如APIClient、repoID、UserID
      • 错误示例:UrlArray,应该统一成urlArray或URLArray
      • 若变量类型为bool类型,则名称应该以Has、Is、Can或Allow开头
var isExit bool
var hasConflict bool
var canManage bool
var allowGitHook bool
  • 常量命名
    • 常量均需使用全部大写字母组成,并使用下划线分词,const APP_VER = "1.0"
    • 如果是枚举类型的常量,需要先创建相应类型
type Scheme string

const (
	HTTP Scheme = "http"
	HTTPS Scheme = "https"
)

2 - 注释规范

  • 单行注释:任意地方//
  • 多行注释:以/*开头,*/结束
  • go自带的godoc文档工具
    • go语言自带的godoc工具可以根据注释生成文档,生成可以自动生成对应的网站(golang.org就是使用godoc工具直接生成的),注释的质量决定了生成文档的质量;
    • 每个包都应该有一个包注释,在package子句之前有一个块注释;对于多文件包,包注释需要存在于一个文件中,任何一个都可以;包评论应该介绍包,并提供与整个包相关的信息;它将首先出现在godoc页面上,并应设置下面的详细文档
  • 包注释:每个包都应该有一个包注释,一个位于package子句之前的块注释或行注释;包如果有多个go文件,只需要出现在一个go文件中(一般是和包同名的文件)即可;包注释应该包含下面基本信息(请严格按照这个顺序:简介、创建人、创建时间)
    • 包的基本简介(包名 简介)
    • 创建者,格式:创建人:rtx名
    • 创建时间,格式:创建时间:yyyyMMdd
// util包:该包包含了项目公用的一些常量,封装了项目中一些共用函数
// 创建人:zjp
// 创建时间:20220709
package util
  • 结构体(接口)注释
    • 每个自定义的结构体或者接口都应该有注释说明,该注释对结构进行简要介绍,放在结构体定义的前一行,格式为:结构体名 , 结构体说明;
    • 同时结构内的每个成员变量都要有说明,该说明放在成员变量的后面(注意对齐)
// User , 用户对象,定义了用户的基础信息
type User struct {
	UserName string //用户名
	Email    string //邮箱
}
  • 函数(方法)注释:每个函数,或者方法(结构体或者接口下的函数称为方法)都应该有注释说明,函数的注释应该包括三个方面(严格按照此顺序编写)
    • ①.简要说明,格式说明:以函数名开头, " , "分隔说明部分
    • ②.参数列表:每个一个参数,参数名开头, " , "分隔说明部分
    • ③.返回值:每行一个返回值
// NewAttrModel , 属性数据层操作类的工厂方法
// 参数:
//		ctx:上下文信息
// 返回值:
//		属性操作类指针
func NewAttrModel(ctx *common.Context) *AttrModel{
	
}
  • 代码逻辑注释:对于一些关键位置的代码逻辑,或者局部较为复杂的逻辑,需要有相应的逻辑说明,方便其他开发者阅读该段代码
	// 从 Redis 中批量读取属性,对于没有读取到的 id ,记录到一个数组里面,准备从 DB 中读取
	xxxx
	xxxxxx
	xxxxxx
  • 注释风格:统一使用中文注释,对于中英文字符之间严格使用空格分隔,这个不仅仅是中文和英文之间,英文和中文标点之间也都要使用空格分隔
    • Redis、id、DB和其他中文字符之间都是使用了空格分隔
      • 建议全部使用单行注释
      • 和代码规范一样,单行注释不要过长,禁止超过120字符
// 从 Redis 中批量读取属性 , 对于没有读取到的 id , 记录到一个数组里面 , 准备从 DB 中读取

3 - import规范

  • import多行:import在多行的情况下,goimports会自动帮我们格式化,但是我们这里还是规范一下import的一些规范,如果你在一个文件里面引入了一个package,还是建议采用如下格式
import (
	"fmt"
)
  • import多类型包:假设你引入了三种类型的包,标准库包、第三方包、程序内部包,建议采用如下方式进行组织包 -> 有顺序的引入包,不同类型采用空格分离,第一是标准库、第二是第三方包、第三是项目包
import (
	"encoding/json"
	"fmt"
	"strings"

	"github.com/astaxie/beego"
	"github.com/go-sql-driver/mysql"
	
	"myproject/controller"
	"myproject/models"
	"myproject/utils"
)
  • 在项目中不要使用相对路径引入包但是如果是引入本项目中的其他包建议使用相对路径
import (
	"../net" //bad

	"github.com/repo/proj/src/net" //good
)

4 - 错误处理规范

  • 不要丢弃error:错误处理的原则就是不能丢弃任何有返回err的调用,不要使用_丢弃,必须全部处理;接收到错误,要么返回err,或者使用log记录下来
  • 尽早return:一旦有错误,马上返回
  • 尽量不要使用panic:除非你知道你在做什么
  • 错误描述如果是英文必须为小写,不需要标点结尾
  • 采用独立的错误流进行处理
	// 错误写法
	if err != nil {
		// error handling
	} else {
		// normal code
	}

	// 正确写法
	if err != nil {
		// error handling
		return // or continue, etc.
	}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无休止符

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值