这是我参与「第三届青训营 -后端场」笔记创作活动的第1篇笔记。
一、Go 语言介绍
Go 语言(或 Golang)是 Google 2009 年首次开源,并在 2012 年正式发布 Go 稳定版的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去10多年间软件开发的难度令人沮丧。Google 对 Go 寄予厚望,其设计是让软件充分发挥 多核心处理器同步多工 的优点,并可解决面向对象程序设计的麻烦。它具有现代的程序语言特色,如垃圾回收,帮助开发者处理琐碎但重要的内存管理问题。Go 的速度也非常快,几乎和 C 或 C++ 程序一样快,且能够快速开发应用程序。
Go(又称 Golang)一种 静态强类型、编译型 语言。Go 语言语法与 C 相近,但功能上有:内存安全,GC(垃圾回收),结构形态及 CSP-style 并发计算。
-
Go 思想 Less can be more 大道至简,小而蕴真,让事情变得复杂很容易,让事情变得简单才难,深刻的工程文化。
-
Go 语言为并发而生 Go语言在 多核并发 上拥有原生的设计优势,Go语言从底层原生支持并发,无须第三方库、开发者的编程技巧和开发经验。
Go是非常年轻的一门语言,它的主要目标是 “兼具Python 等动态语言的开发速度和C/C++等编译型语言的性能与安全性”
很多公司,特别是中国的互联网公司,即将或者已经完成了使用 Go 语言改造旧系统的过程。经过 Go 语言重构的系统能 使用更少的硬件资源获得更高的并发和I/O吞吐表现 。充分挖掘硬件设备的潜力也满足当前精细化运营的市场大环境。
Go语言的并发是基于 goroutine 的,goroutine 类似于线程,但并非线程。可以将 goroutine 理解为一种 虚拟线程 。Go 语言运行时会参与调度 goroutine,并将 goroutine 合理地分配到每个 CPU 中,最大限度地使用CPU性能。开启一个goroutine的消耗非常小(大约2KB的内存),你可以轻松创建数百万个goroutine。
goroutine的特点:
goroutine 具有可增长的分段堆栈。这意味着它们只在需要时才会使用更多内存。 goroutine 的启动时间比线程快。 goroutine 原生支持利用 channel 安全地进行通信。 goroutine 共享数据结构时无需使用互斥锁。 3. Go 语言简单易学 语法简洁 Go 语言简单易学,学习曲线平缓,不需要像 C/C++ 语言动辄需要两到三年的学习期。Go 语言被称为“互联网时代的C语言”。Go 语言的风格类似于C语言。其语法在C语言的基础上进行了大幅的简化,去掉了不需要的表达式括号,循环也只有 for 一种表示方法,就可以实现数值、键值等各种遍历。
代码风格统一 Go 语言提供了一套 格式化工具 ——go fmt。一些 Go 语言的开发环境或者编辑器在保存时,都会使用格式化工具进行修改代码的格式化,这样就保证了不同开发者提交的代码都是统一的格式。
开发效率高
Go语言实现了开发效率与执行效率的完美结合,让你像写Python代码(效率)一样编写C代码(性能)。
- Go 优点 自带gc。
静态编译,编译好后,扔服务器直接运行。
简单的思想,没有继承,多态,类等。
丰富的库和详细的开发文档。
语法层支持并发,和拥有同步并发的channel类型,使并发开发变得非常方便。
简洁的语法,提高开发效率,同时提高代码的阅读性和可维护性。
超级简单的交叉编译,仅需更改环境变量。
- Go 适合做什么 服务端开发 分布式系统,微服务 网络编程 区块链开发 内存KV数据库,例如boltDB、levelDB 云平台
二、Go 语言特点 自动立即回收。 更丰富的内置类型。 函数多返回值。 错误处理。 匿名函数和闭包。 类型和接口。 并发编程。 反射。 语言交互性。 三、Go 语言基础
-
Go 文件名 所有的go源码都是以 “.go” 结尾。
-
Go标记 Go 程序由多个标记组成,包括关键字,标识符,常量,字符串,符号。
-
关键字 Go只有25个关键字:
break default func interface select case defer go map struct chan else goto package switch const fallthrough if range type continue for import return var
Go还有37个保留字:
Constants: true false iota nil
Types: int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptr
float32 float64 complex128 complex64
bool byte rune string error
Functions: make len cap new append copy close delete complex real imag panic recover
程序一般由关键字、变量、常量、运算符、类型和函数组成。 程序中可能会使用到这些分隔符:括号 (),中括号 [] 和大括号 {}。 程序中可能会使用到这些标点符号:. , ; : …
- 标识符 标识符用来 命名 变量、类型等程序实体。一个标识符实际上是由一个或是多个字母(大写或小写)、数字(0~9)、下划线_所组成的序列,但是第一个字符必须是字母或下划线而不能是数字。
以下是有效的标识符:
mahesh kumar abc move_name a_123 myname50 _temp j a23b9 retVal
以下是无效的标识符:
- 1ab(以数字开头)
- case(Go 语言的关键字)
- a+b(运算符是不允许的)
另外:以大写字母开头的标识符可导出 当标识符(包括常量、变量、类型、函数名、结构字段等等)以一个大写字母开头,如:Group1,那么使用这种形式标识符的对象就可以被外部包的代码所使用(客户端程序需要先导入这个包),这被称为导出(像面向对象语言中的 public);标识符如果以小写字母开头,则对包外是不可见的,但是他们在整个包的内部是可见并且可用的(像面向对象语言中的 protected )。
总结 Go的函数、变量、常量、自定义类型、包(package)的命名方式遵循以下规则: 1)首字符可以是任意的Unicode字符或者下划线 2)剩余字符可以是Unicode字符、下划线、数字 3)字符长度不限
- Go 语言声明: 有四种主要声明方式:
var(声明变量), const(声明常量), type(声明类型) ,func(声明函数) 1 Go程序保存在多个.go文件中,文件的第一行就是 package XXX 声明,用来说明 该文件属于哪个包(package),package声明下来就是import声明(导入哪些包),再下来是类型,变量,常量,函数的声明。
声明的位置决定其作用域: 1)声明在函数内部,是函数的本地值,类似 private 2)声明在函数外部,是对当前包可见(包内所有.go文件都可见)的全局值,类似 protect 3)声明在函数外部且首字母大写是所有包可见的全局值,类似 public
- 不存在行分隔符 在 Go 程序中,一行代表一个语句结束。 不需要像 C 家族中的其它语言一样以分号 ; 结尾,因为这些工作都将由 Go 编译器自动完成。
如果你打算将多个语句写在同一行,它们则必须使用 ; 人为区分,但在实际开发中我们并不鼓励这种做法。
- { 不能单独放在一行 表示函数体开始的前花括号“ { ” 不能单独放在一行。 例如,以下代码运行会报错:
package main
import "fmt"
func main()
{ // 错误,{ 不能在单独的行上
fmt.Println("Hello, World!")
}
错误内容:
.\main.go:13:6: missing function body .\main.go:14:1: syntax error: unexpected semicolon or newline before {
正确代码:
package main
import "fmt"
func main() { //“{”没有单独在一行 fmt.Println("Hello, World!") }
- 实现字符串连接:+ package main import "fmt" func main() { fmt.Println("Google" + "Runoob") }
以上实例输出结果为:
GoogleRunoob 1 9. 空格的使用 Go 语言中变量的声明必须使用空格隔开,如: var age int; 1 而且空格的使用会使得程序更加可读和美观。 10. 格式化字符串:fmt.Sprintf Go 语言中可以使用 fmt.Sprintf 格式化字符串并赋值给新串:
package main
import ( "fmt" )
func main() { // %d 表示整型数字,%s 表示字符串 var stockcode=123 var enddate="2020-12-31" var url="Code=%d&endDate=%s" var target_url=fmt.Sprintf(url,stockcode,enddate) fmt.Println(target_url) }
输出结果为:
Code=123&endDate=2020-12-31
fmt.Sprintf 格式化字符串的格式如下:
fmt.Sprintf(格式化样式, 参数列表…)
格式化样式:字符串形式,格式化符号以 % 开头, %s 字符串格式,%d 十进制的整数格式。Go 字符串格式化符号:
参数列表:多个参数以逗号分隔,个数必须与格式化样式中的个数一一对应,否则运行时会报错。