Go语言学习目录
1. Go语言开篇
1.1 GoLang的学习方向
区块链研发
服务端开发
游戏开发
分布式开发
云计算开发
1.2 GoLang应用领域
1.2.1 区块链技术(分布式账本技术)
区块链是一种互联网数据库技术,特点是去中心化、公开透明,让每个人可以参与数据库记录。
1.2.2 服务端应用
后台流量(排序、推荐、搜索),负载均衡,cache,容错,按条件分流,统计运行指标(qps,latency)
游戏服务端(通讯、逻辑,数据存储)
1.2.3 云计算和云服务
CDN(内容分发网络)调度,分发、监控系统,短域名服务,分布式文件系统
2 GoLang概述
2.1 发展史
2.1.1 go语言设计者
- 肯·汤普森
UNIX设计者,C语言设计者 - 罗布·派克
参与UNIX系统设计,创造UTF8编码,1980年奥运会射箭银牌,天文学家;
他老婆设计了Go语言的金花鼠LOGO - Robert Griesemer
协助之作Java的HotSpot编译器,Chrome浏览器的JavaScript引擎V8
2.1.2 Google为什么创造go语言
- 计算机硬件发展迅速,性能提高很快,但是编程语言发展落后于硬件不能充分发挥多核CPU的优势
- 软件系统的复杂度和维护成本都越来愈高,缺乏主流的足够简洁高效的编程语言
现有编程语言现状:(1)风格不统一(2)计算能力不够(3)处理大并发不够好
- c/c++语言编译速度慢,还存在内存泄露等困扰
2.1.3 Go语言发展史
- 2007年开始设计一门全新语言,Go语言的最初原型
- 2009年11月10日,开放源代码
- 2015年8月19日,go1.5版本发布,移除了“最后残余的c代码”
- 2017年2月17日,go1.8版本发布
- 2017年8月24日,go1.9版本发布
- 2017年2月16日,go1.10版本发布
2.2 Go语言特点
go语言既有静态编译语言的安全和性能又有动态语言开发维护的高效率。Go=c+python
- 从c语言中继承了很多理念,例如表达式语法、控制结构、调用参数传值、指针等等,也保留了和c语言一样的编译执行方式和弱化的指针。
//go语言的指针使用
func testPtr(num *int){
*num = 20
}
- 引入包的概念,用于组织程序结构,Go语言的一个文件都属于一个包,不能单独存在
package main
//go语言的指针使用
func testPtr(num *int){
*num = 20
}
func main() {
}
-
垃圾回收机制,内存自动回收,不需要开发人员管理
-
天然并发(重中之重)
(1)语言层面支持并发,实现简单
(2)goroutine,轻量级线程,可以实现大并发处理,高效利用多核
(3)基于CPS(Communicating Sequential Processes)并发模型实现 -
吸收了管道通信机制,形成go语言特有的管道channel
通过管道可以实现不同的goroutine之间的通信 -
函数返回多个值
//一个函数,返回两个数的和和两个数的差
func getSumAndSub(n1 int , n2 int )(int, int){
//go语句后面不用带分号
sum := n1 + n2
sub := n1 - n2
return sum, sub
}
- 一些新特性,例如切片,延时执行defer等
2.3 GoLang开发工具
VSCode
2.4 Windows环境下安装配置SDK
(1) 下载SDK工具包
windows 64位使用 go1.9.2.windows-amd64.zip包
下载地址:https://dl.google.com/go/go1.9.2.windows-amd64.zip
注意:安装路径不要有空格、特殊字符或者中文等符号
(2)解压
解压到一个目录下,此处我的目录是
D:\GoSDK\go
(3)检验SDK
PS D:\GoSDK\go\bin> ls
目录: D:\GoSDK\go\bin
Mode LastWriteTime Length Name
---- ------------- ------ ----
------ 2017/10/25 18:32 10254848 go.exe
------ 2017/10/25 18:41 15241728 godoc.exe
------ 2017/10/25 18:32 3404288 gofmt.exe
PS D:\GoSDK\go\bin> .\go version go version go1.9.2 windows/amd64
(3)配置环境变量
环境变量 | 说明 | 具体路径 |
---|---|---|
GOROOT | 指定SDK的安装路径 | D:\GoSDK\go |
Path | 添加SDK的/bin目录 | %GOROOT%\bin |
GOPATH | 工作目录 | D:\GoProject |
(4)检验环境变量的配置
PS C:\WINDOWS\system32> go version
go version go1.9.2 windows/amd64
PS C:\WINDOWS\system32>
2.5 Hello World案例程序
(1) 程序目录结构
(2)hello world程序
package main
import "fmt"
//go语言的指针使用
func testPtr(num *int){
*num = 20
}
//一个函数,返回两个数的和和两个数的差
func getSumAndSub(n1 int , n2 int )(int, int){
//go语句后面不用带分号
sum := n1 + n2
sub := n1 - n2
return sum, sub
}
func main() {
fmt.Println("hello world")
}
(3) 编译运行
PS D:\GoProject\src\project01\main> go build hello.go CreateFile hello.go: The system cannot find the file specified.
PS D:\GoProject\src\project01\main> go build main.go PS D:\GoProject\src\project01\main> ls
目录: D:\GoProject\src\project01\main
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2020/5/17 20:41 1938432 main.exe
-a---- 2020/5/17 20:27 346 main.go
PS D:\GoProject\src\project01\main> .\main.exe
hello world
PS D:\GoProject\src\project01\main>
PS D:\GoProject\src\project01\main> go run main.go hello world
PS D:\GoProject\src\project01\main>
2.5.1 GoLang执行流程分析
- go build 编译执行流程:
- go run 流程
- 两种方式区别
(1)如果先编译生成了可执行文件,我们可以将可执行文件拷贝到没有go开发环境的机器上进行执行
(2)使用go run 方式,如果需要在另一台机器上运行,仍然是需要go开发环境的,否则无法执行。
(3)在编译时,编译器会讲依赖的库包含在可执行文件中,所以,可执行文件变大了很多。
2.5.2 编译运行的补充说明
(1)go build 可以指定可执行文件的名字
D:\GoProject\src\project01\main>go build -o myhello.exe main.go
D:\GoProject\src\project01\main>dir
驱动器 D 中的卷是 DATA
卷的序列号是 66F3-62B9
D:\GoProject\src\project01\main 的目录
2020/05/20 14:49 <DIR> .
2020/05/20 14:49 <DIR> ..
2020/05/17 20:41 1,938,432 main.exe
2020/05/17 20:27 346 main.go
2020/05/20 14:49 1,938,432 myhello.exe
3 个文件 3,877,210 字节
2 个目录 299,638,734,848 可用字节
2.6 go语法细节
(1) Go源文件以.go为扩展名
D:\GoProject\src\project01\main>copy main.go main.c
已复制 1 个文件。
D:\GoProject\src\project01\main>dir
驱动器 D 中的卷是 DATA
卷的序列号是 66F3-62B9
D:\GoProject\src\project01\main 的目录
2020/05/20 15:01 <DIR> .
2020/05/20 15:01 <DIR> ..
2020/05/17 20:27 346 main.c
2020/05/17 20:41 1,938,432 main.exe
2020/05/17 20:27 346 main.go
2020/05/20 14:49 1,938,432 myhello.exe
4 个文件 3,877,556 字节
2 个目录 299,638,734,848 可用字节
D:\GoProject\src\project01\main>go build main.c
can't load package: package main.c: cannot find package "main.c" in any of:
D:\GoSDK\go\src\main.c (from $GOROOT)
D:\GoProject\src\main.c (from $GOPATH)
(2) go 语言入口是main函数
(3) 严格区分大小写
(4) 语句后不用分号
(5) 一行一条语句
(6) 定义的变量或者import的包没有用到的话,代码编译不能通过
(7) 大括号成对出现,缺一不可
2.7 其他tips
(1)快速在cmd控制台进入指定的目录
选中要进入的目录的文件路径
(2)直接输入cmd即可
(3)效果
16 goroutine和channel
16.1 引例
求1-9000000000000之间的素数
16.2 协程基本介绍
16.2.1 进程和线程的关系
16.2.2 并发和并行
16.2.3 go协程特点
有独立的栈空间
共享程序堆空间
调度由用户控制
协程是轻量级的线程
16.3 协程入门案例
16.3.1 程序需求
16.3.2 代码实现
package main
import (
"fmt"
"strconv"
"time"
)
func test() {
for i :=1 ;i <=10 ; i++{
fmt.Println("test: hello, world " + strconv.Itoa(i))
time.Sleep(time.Second)
}
}
func main() {
//开启协程
go test()
for i :=1 ;i <=10 ; i++{
fmt.Println("main: hello, golang " + strconv.Itoa(i))
time.Sleep(time.Second)
}
}
- 运行效果
D:\GoProject\src\chapter16\goroutine>go run main.go
main: hello, golang 1
test: hello, world 1
test: hello, world 2
main: hello, golang 2
main: hello, golang 3
test: hello, world 3
test: hello, world 4
main: hello, golang 4
test: hello, world 5
main: hello, golang 5
test: hello, world 6
main: hello, golang 6
test: hello, world 7
main: hello, golang 7
test: hello, world 8
main: hello, golang 8
test: hello, world 9
main: hello, golang 9
test: hello, world 10
main: hello, golang 10
- 程序运行流程
16.4 MPG模型
M:操作系统主线程(是物理线程)
P:协程执行需要的上下文
G:协程
加粗文本 加粗文本
删除文本
引用文本
H2O is是液体。
210 运算结果是 1024.
链接: link.
图片:
带尺寸的图片:
居中的图片:
居中并且带尺寸的图片:
当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。
如何插入一段漂亮的代码片
去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片
.
// An highlighted block
var foo = 'bar';
生成一个适合你的列表
- 项目
- 项目
- 项目
- 项目
- 项目1
- 项目2
- 项目3
- 计划任务
- 完成任务
创建一个表格
一个简单的表格是这么创建的:
设定内容居中、居左、居右
使用:---------:
居中
使用:----------
居左
使用----------:
居右
第一列 | 第二列 | 第三列 |
---|---|---|
第一列文本居中 | 第二列文本居右 | 第三列文本居左 |
SmartyPants
SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:
TYPE | ASCII | HTML |
---|---|---|
Single backticks | 'Isn't this fun?' | ‘Isn’t this fun?’ |
Quotes | "Isn't this fun?" | “Isn’t this fun?” |
Dashes | -- is en-dash, --- is em-dash | – is en-dash, — is em-dash |
创建一个自定义列表
-
Markdown
- Text-to- HTML conversion tool Authors
- John
- Luke
如何创建一个注脚
一个具有注脚的文本。1
注释也是必不可少的
Markdown将文本转换为 HTML。
KaTeX数学公式
您可以使用渲染LaTeX数学表达式 KaTeX:
Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n−1)!∀n∈N 是通过欧拉积分
Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=∫0∞tz−1e−tdt.
你可以找到更多关于的信息 LaTeX 数学表达式here.
新的甘特图功能,丰富你的文章
- 关于 甘特图 语法,参考 这儿,
UML 图表
可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图:
这将产生一个流程图。:
- 关于 Mermaid 语法,参考 这儿,
FLowchart流程图
我们依旧会支持flowchart的流程图:
- 关于 Flowchart流程图 语法,参考 这儿.
导出与导入
导出
如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。
导入
如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。
注脚的解释 ↩︎