Go语言学习 | 青训营笔记

258 阅读4分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记

Go语言学习

本文主要针对Go语言的基础学习。

Go语言简介

  • Go语言本身只有很少的特性,也不太可能添加太多的特性。例如,它没有隐式的数值转换,没有构造函数和析构函数,没有运算符重载,没有默认参数,也没有继承,没有泛型,没有异常,没有宏,没有函数修饰,更没有线程局部存储。但是,语言本身是成熟和稳定的,而且承诺保证向后兼容:用之前的Go语言编写程序可以用新版本的Go语言编译器和标准库直接构建而不需要修改代码。

  • Go语言有足够的类型系统以避免动态语言中那些粗心的类型错误,但是,Go语言的类型系统相比传统的强类型语言又要简洁很多。虽然,有时候这会导致一个“无类型”的抽象类型概念,但是Go语言程序员并不需要像C++或Haskell程序员那样纠结于具体类型的安全属性。在实践中,Go语言简洁的类型系统给程序员带来了更多的安全性和更好的运行时性能。

  • Go语言鼓励当代计算机系统设计的原则,特别是局部的重要性。它的内置数据类型和大多数的准库数据结构都经过精心设计而避免显式的初始化或隐式的构造函数,因为很少的内存分配和内存初始化代码被隐藏在库代码中了。Go语言的聚合类型(结构体和数组)可以直接操作它们的元素,只需要更少的存储空间、更少的内存写操作,而且指针操作比其他间接操作的语言也更有效率。由于现代计算机是一个并行的机器,Go语言提供了基于CSP的并发特性支持。Go语言的动态栈使得轻量级线程goroutine的初始栈可以很小,因此,创建一个goroutine的代价很小,创建百万级的goroutine完全是可行的[1]。

Go语言优势

1.高性能、高并发 2.语法简单、学习曲线平缓 3.丰富的标准库 4.完善的工具链 5.静态链接 6.快速编译 7.跨平台 8.垃圾回收

字节跳动为什么选择Go语言?

  • 最开始公司的后端业务主要是web后端,早期团队非Java背景,C++不太适合在线Web业务,所以最开始的服务都是 python的大概从2014年开始,随着业务体量的增长,python遇到一些性能问题。

  • —些团队初步尝试使用了Go,发现入门很简单,开发效率高,性能也比较好。go语言的开发和部署非常简单,顺带解决了之前python带来的很头疼的依赖库版本问题。—些业务尝到甜头之后,后面开始公司级大力推广,诞生了公司内部的基于golang的rpc和http框架。随着框架的推广,越来越多的python服务使用golang重写,至今为止,golang已经成为内部使用率最高的编程语言

  • 从业务维度看过语言已经在云计算、微服务、大数据、区块链、物联网等领域蓬勃发展。然后在云计算、微服务等领域已经有非常高的市场占有率Docker、Kubernetes、Istio、etcd、prometheus几乎所有的云原生组件全是用Go实现的。

  • 开发工具 vscode gitpod

工程实践

Goroutine

Channel

Sync

1.配置文件,描述依赖 go.mod

2.中心仓库管理依赖库 Proxy

3.本地工具 go get/mod

单元测试

单元测试-规则

所有测试文件以_test.go结尾

func TestXx(*testing.T)

初始化逻辑放到TestMain中

单元测试-覆盖率

如何衡量代码是否经过了足够的测试?如何评价项目的测试水准? 如何评估项目是否达到了高水准测试等级?

一般覆盖率:50%~60%,较高覆盖率80%+ 测试分支相互独立、全面覆盖。 测试单元粒度足够小,函数单一职责。

代码学习

编程语句

defer语句会在函数返回前调用, 多个defer语句是后进先出

func main( ) {
     if true {
        defer fmt.Printf( "1")}
     else {
        defer fmt.Printf( "2")
        }
     defer fmt .Printf( "3" )
     }

参考文献

[1] Go语言圣经(中文版) books.studygolang.com/gopl-zh/ch0…

[2] 青训营PPT