Go 语言简介
- Go 语言是 Google 在2007年开发的一种开源编程语言,于2009年11月10日向全球公布
- 出自 Ken Thompson 和 Rob Pike、Robert Griesemer 之手,他们都是计算机科学领域的重量级人物
- 是非常年轻的一门语言,它的主要目标是“兼具 Python 等动态语言的开发速度和 C/C++等编译型语言的性能与安全性”
- 是编程语言设计的又一次尝试,是对类C语言的重大改进,它不但能让你访问底层操作系统,还提供了强大的网络编程和并发编程支持。Go 语言的用途众多,可以进行网络编程、系统编程、并发编程、分布式编程
Go 语言的设计和实现体现了多位计算机专家多年的经验以及对其他编程语言优缺点的深入认识。因 C++ 的不良体验而出现的 Go 语言是一门现代编程语言,可用来创建性能卓越的 Web 服务器和系统程序
Go 语言吉祥物
Go 语言有一个吉祥物,在会议、文档页面和博文中,大多会包含下图所示的 Go Gopher,这是才华横溢的插画家 Renee French 设计的,她也是 Go 设计者之一 Rob Pike 的妻子
Go 是编译型语言
Go 使用编译器来编译代码,编译器将源代码编译成二进制(或字节码)格式;在编译时,编译器检查错误,优化性能并输出可在不同平台上运行的二进制文件
要创建并运行 Go 程序,必须执行如下步骤:
- 使用编辑器创建 go 程序,保存文件
- 编译程序
- 运行编译得到的可执行文件
环境搭建
根据平台环境在官网下载最新版本安装包即可,然后配置环境变量:GOPATH,GOROOT
官网教程:golang.org
第一句代码
package main import ( "fmt" ) func main(){ fmt.Println("hello, golang~") }
语言特性
垃圾回收
- 内存自动回收,不需要开发人员进行内存管理
- 专注业务实现,降低心智负担
- 只需要 new 分配内存,不需要释放
天然并发
- 从语言层面上支持并发,非常简单
- goroutine 轻量级线程,创建成千上万个 goroutine 成为可能
- 基于 CSP(Communicating Sequential Process)模型实现
channel
- 管道,类似于 unix / linux 中的 pipe
- 多个 goroutine 之间通过 channel 进行通信
- 支持任何类
func main(){ pipe := make(chan int, 2) pipe <- 1 pipe <- 2 }
多个 goroutine 中,使用 channel 进行通信,程序可以将需要并发的环节设计为生产者和消费者模式,将数据放入通道,通道的另外一端的代码将这些数据进行计算并返回结果,如下图:
下面代码中的生产者每秒生成一个字符串,并通过通道传给消费者,生产者使用两个 goroutine 并发运行,消费者在 main() 函数的 goroutine 中进行处理:
package main import ( "fmt" "math/rand" "time" ) func producer(header string, channel chan string){ for{ channel <- fmt.Sprintf("%s: %v", header, rand.Int31()) // 生成一个随机数 time.Sleep(time.Second) } } func customer(channel chan string){ for{ message := <- channel // 从管道中获取数据 fmt.Println(message) } } func main(){ var channel chan string = make(chan string) // 创建一个 字符串类型的管道 go producer("cat", channel) // 并发执行一个生产者函数 go producer("dog", channel) customer(channel) }
多返回值
一个函数多返回值
package main import ( "fmt" ) func calc(a int, b int) (int, int) { sum := a + b avg := (a + b) / 2 return sum, avg } func main(){ sum, avg := calc(100, 200) fmt.Println("sum", sum, "avg", avg) }
包的概念
- 和 python 一样,把相同功能的代码放在一个目录,称之为包
- 包可以被其它包引用(包内文件中定义的函数名首字母需大写,否则不能被其它包应用)
- main 包用来生成可执行文件,每个程序只有一个 main 包
- 包的主要作用是提高代码的可复用性
关于 main 包中的 main() 函数,Go 程序经过编译之后,运行该程序,会将编译好的二进制文件加载到内存中,会首先调用 main() 函数,所以 main() 函数是程序的入口,必须要有 package main
关于包,是我们可以把一些常用的功能封装到包中,这个时候包中的每个 go 文件的开头则不需要 package main,而是 package 自定义名称,这个自定义名称是根据这个包的功能进行命名
包的命名
Go 语言包的命名,遵循简洁,小写,和 go 文件所在目录同名的原则,这样就便于我们引用、书写以及快速定位查找
比如 net/http 这个包,它这个目录下的所有 go 文件都属于这个 http 包,所以使用 http 包里边的函数、接口,导入这个 http 包就好了
net 下面的包:
net
├── http
├── internal
├── mail
├── rpc
├── smtp
├── testdata
├── textproto
└── url
目录结构规范
举一个简单的例子:如果我们在建立一个 go_project 目录,通常在这个目录下我们会创建如下目录
src:存放不同的项目代码
bin:存放编译后的可执行文件
vender 存放引用的第三方库
pkg:存放静态库
作业
使用 fmt 分别打印字符串,二进制,十进制,十六进制,浮点数
ending ~