学习路径
- 入门学习:example go
- 系统学习:《go 圣经》 + 《Go 学习笔记》
- 进阶:《Go 语言高级编程》+ 《Go 语言设计与实现》
框架
- Gin:是使用 Go 语言实现的 Web 框架。接口简洁,性能极高。是当前业界主流的Go语言框架。手册
注意事项
-
个人在切换语言中最大的问题:由
弱类型语言
向强类型语言
切换,变量类型
的转换是需要花些时间去适应的。不过Go的编辑器会帮助检查变量类型
是否有误,这点还是很好的。 -
PHP 中绝大多数情况下,进程都是串行执行业务逻辑的(
yield
使用的情况也并不多)。 而 Go 就不同了,天然支持协程,代码中随处可见协程
。每有一个请求都会启动一个协程去处理,而启动一个协程的成本又非常低(只需要 2K 的栈内存),所以可以轻轻松松上万并发。所以对于phper转Gopher来说,抛弃串行的思维模式也很重要。 -
多使用结构体(比如:对请求参数、响应参数的处理),这样可以减少很多类型断言,同时也方便查看。
// 提交双药预测
type submitDoubleDrugParams struct {
DrugA string `json:"drug_a"`
DrugB string `json:"drug_b"`
Name string `json:"name"`
FileUrl string `json:"file_url"`
CellLine string `json:"cell_line"`
Tissues string `json:"tissues"`
}
func SubmitDoubleDrug(ctx context.Context, req ghttp.Request) ghttp.Response {
var params submitDoubleDrugParams
_ = json.Unmarshal(ctx.Value("params").([]byte), ¶ms)
...
}
- 多使用 error 返回函数错误,非必要不适用 panic
在使用PHP时,函数的错误是通过抛出异常,甚至是通过返回 false 之类的值来表示函数遇到的错误。在Go中,通常是让函数返回 error 来明确遇到的错误,所以Go中的函数通常会有两个返回值。
// 添加flow 记录
func (f *Flow) Add(ctx context.Context, flowNew Flow) (Flow, error) {
flowNew.UpdatedAt = time.Now()
db := resource.Gorm.WithContext(ctx)
err := db.Create(&flowNew).Error
if err != nil {
helpers.LogError(ctx, err)
go helpers.HelixNotice(ctx, err.Error())
}
return flowNew, err
}
备注
- 这篇文章写了很多Go新手常会踩的坑,推荐!! 传送门
- Go 开源图书、在线文档