本文目录一览:

Golang入门到项目实战 | golang简介及安装

Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态强类型、编译型语言。Go 语言语法与 C 相近,但功能上有:内存安全,GC(垃圾回收),结构形态及 CSP-style 并发计算。

go语言特点

go语言的应用领域

哪些公司(项目)在使用go语言

下载开发包

windows下安装

1.打开下载的msi可执行文件,根据提示进行安装。默认会安装在c:/Program Files/go目录下面。会自动添加go可执行文件环境变量。

2.验证安装情况

a.打开命令行

b. 输入$ go version

linux下安装

1.在/usr/local/下面创建一个目录go

2.下载压缩文件到该目录(/usr/local/go),并解压缩

3.添加/usr/local/go/bin到PATH环境变量,打开$HOME/.profile 或者/etc/profile输入如下内容:

4.执行如下命令使得配置文件及时生效

验证

1.如果你的mac有Homebrew包管理工具,可以使用它来安装

2.如果没有下载mac安装包,根据提示安装

3.默认安装在/usr/local/go下面

4.设置环境变量,同Linux

Golang 游戏leaf系列(六) Go模块

在 Golang 游戏leaf系列(一) 概述与示例 (下文简称系列一)中,提到过Go模块用于创建能够被 Leaf 管理的 goroutine。Go模块是对golang中go提供一些额外功能。Go提供回调功能,LinearContext提供顺序调用功能。善用 goroutine 能够充分利用多核资源,Leaf 提供的 Go 机制解决了原生 goroutine 存在的一些问题:

我们来看一个例子(可以在 LeafServer 的模块的 OnInit 方法中测试):

这里的 Go 方法接收 2 个函数作为参数,第一个函数会被放置在一个新创建的 goroutine 中执行,在其执行完成之后,第二个函数会在当前 goroutine 中被执行。由此,我们可以看到变量 res 同一时刻总是只被一个 goroutine 访问,这就避免了同步机制的使用。Go 的设计使得 CPU 得到充分利用,避免操作阻塞当前 goroutine,同时又无需为共享资源同步而忧心。

这里主动调用了 d.Cb(-d.ChanCb) ,把这个回调取出来了。实际上,在skeleton.Run里会自己取这个通道

看一下源码:

New方法,会生成指定缓冲长度的ChanCb。然后调用Go方法就是先执行第一个func,然后把第二个放到Cb里。现在手动造一个例子:

这里解释一下,d.Go根据源码来看,实际也是调用了一个协程。然后上面两次d.Go并不能保证先后顺序。目前的输出结果是1+2那个先执行了,把3写入d.ChanCb,然后把3读出来,继续读时,d.ChanCb里没有东西,阻塞了。然后1+1那个协程启动了,最后又读到了2。

现在把time.Sleep(time.Second)的注释解开,会是啥结果呢

这里执行到time.Sleep睡着了,上面两个d.Go仍然是不确定顺序的,但是会各自的function先执行掉,然后陆续把cb写入d.ChanCb。看这次输出,1+2先写进去的。所以最后执行d.Cb时,就把3先读出来了。然后d.ChanCb的长度为1,说明还有一个,就是输出2了。

另外,就是close时会判断g.pendingGo

这个例子的意思很明显,NewLinearContext这种方式,即使先调用的慢了半秒,它还是会先执行完。

这里先是用了一个list,加入的时候用mutexLinearGo锁了,都加到最后。然后新开协程去处理,读的时候从最前面开始读,也要用mutexLinearGo锁。执行的时候,也要上锁mutexExecution,确保f()执行完并且写入g.ChanCb回调,这个mutexExecution锁才会解除。现在可以改造一个带回调的例子:

结果说明,确实是2先被写入了d.ChanCb。

Golang数据结构-树

二叉树是n(n=0)个节点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根节点和两棵互不相交的、分别称为根节点的左子树和右子树的二叉树组成