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) 程序目录结构
go程序的一般目录结构
(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.

图片: Alt

带尺寸的图片: Alt

居中的图片: Alt

居中并且带尺寸的图片: Alt

当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

如何插入一段漂亮的代码片

博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

// An highlighted block
var foo = 'bar';

生成一个适合你的列表

  • 项目
    • 项目
      • 项目
  1. 项目1
  2. 项目2
  3. 项目3
  • 计划任务
  • 完成任务

创建一个表格

一个简单的表格是这么创建的:

设定内容居中、居左、居右

使用:---------:居中
使用:----------居左
使用----------:居右

第一列第二列第三列
第一列文本居中第二列文本居右第三列文本居左

SmartyPants

SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

TYPEASCIIHTML
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)=(n1)!nN 是通过欧拉积分

Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t   . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=0tz1etdt.

你可以找到更多关于的信息 LaTeX 数学表达式here.

新的甘特图功能,丰富你的文章

Mon 06 Mon 13 Mon 20 已完成 进行中 计划一 计划二 现有任务 Adding GANTT diagram functionality to mermaid
  • 关于 甘特图 语法,参考 这儿,

UML 图表

可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图:

张三 李四 王五 你好!李四, 最近怎么样? 你最近怎么样,王五? 我很好,谢谢! 我很好,谢谢! 李四想了很长时间, 文字太长了 不适合放在一行. 打量着王五... 很好... 王五, 你怎么样? 张三 李四 王五

这将产生一个流程图。:

链接
长方形
圆角长方形
菱形
  • 关于 Mermaid 语法,参考 这儿,

FLowchart流程图

我们依旧会支持flowchart的流程图:

Created with Raphaël 2.2.0 开始 我的操作 确认? 结束 yes no
  • 关于 Flowchart流程图 语法,参考 这儿.

导出与导入

导出

如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

导入

如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。


  1. 注脚的解释 ↩︎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值