
go语言实战学习
go语言实战学习
wymyimeng
这个作者很懒,什么都没留下…
展开
-
简单的go程序
package mainimport ( "fmt" "sync")var wg sync.WaitGroupfunc printer(ch chan int) { for i := range ch { fmt.Println("Receive ",i) } wg.Done()}func m原创 2018-09-10 08:03:18 · 739 阅读 · 0 评论 -
并发模式
1、runnerrunner 包用于展示如何使用通道来监视程序的执行时间,如果程序执行时间太长,也可以用runner 包来终止程序。runner 包程序// Example is provided with help by Gabriel Aszalos.// Package runner manages the running and lifetime of a process.pac...原创 2018-10-24 07:41:11 · 198 阅读 · 0 评论 -
Go中的测试之单元测试
单元测试时用来测试包或者程序的一部分代码或者一组代码的函数。在Go语言中,其单元测试主要包括:基础测试,其只使用一组参数和结果来测试一段代码。表组测试也会测试一段代码,但是会使用多组参数和结果进行测试。也可以使用一些方法来模拟测试代码需要用到的外部资源,如数据库或者网络服务器。这有助于让测试在没有所需的外部资源可用的时候,模拟这些资源的行为让测试正常进行。1、基础单元测试package ch...原创 2018-10-26 08:17:10 · 3476 阅读 · 0 评论 -
编码、解码
在今天,JSON远比XML流行。这主要原因是因为与XML相比,使用JSON所处理的标签更少。而这就意味着网络传输时每个消息的数据更少,从而提升整个系统的性能。而且,JSON可以转化为BSON(Binary JavaScript Object Notation,二进制JavaScript对象标记),进一步缩小每个消息的数据长度。1、解码JSON(1)、使用 json 包的 NewDecoder ...原创 2018-10-25 08:00:55 · 163 阅读 · 0 评论 -
并发之通道
在Go 语言里,我们不仅可以使用原子函数和互斥锁来保证对共享资源的安全访问以及消除竞争状态,还可以使用通道。通过发送和接收需要共享的资源,在 goroutine 之间做同步。我们通过通道可以共享内置类型、命名类型、结构类型和引用类型的值或者指针。 // 创建无缓冲的整型通道 unbuffered := make(chan int) // 创建有缓冲的字符串通道 buffered := ...原创 2018-10-17 08:32:22 · 242 阅读 · 0 评论 -
并发之锁住共享资源
Go 语言针对并发提供了传统的同步 goroutine 的机制,就是对共享资源加锁。如果需要顺序访问一个整型变量或者一段代码, atomic 和 sync 包的函数提供了很好的解决方案。1、原子函数package mainimport ( "fmt" "runtime" "sync" "sync/atomic")var ( counter int64 wg sync.Wa...原创 2018-10-17 08:04:56 · 299 阅读 · 0 评论 -
并发之竞争状态
如果两个或者多个 goroutine 在没有互相同步的情况下,访问某个共享的资源,并试图同时读和写这个资源,就处于相互竞争的状态。这种情况被称作竞争状态。要想解决竞争状态,对一个共享资源的读和写操作必须是原子化的。也就是说,同一时刻只能有一个 goroutine 对共享资源进行读和写操作。可见代码为:package mainimport ( "fmt" "runtime" "sync...原创 2018-10-16 08:31:43 · 552 阅读 · 0 评论 -
并发之goroutine
先来一个有关 goroutine的代码package mainimport ( "fmt" "runtime" "sync")var wg sync.WaitGroupfunc main() { // 分配一个逻辑处理器给调度器使用 runtime.GOMAXPROCS(1) // wg 用来等待程序完成 // 计数器加2,表示要等原创 2018-10-16 07:54:19 · 108 阅读 · 0 评论 -
接口
接口是用来定义行为的类型,这些被定义的行为不由接口直接实现,而是通过方法由用户定义的类型实现。如果用户定义的类型实现了某个接口类型声明的一组方法,那么这个用户定义的类型的值就可以赋值给这个接口类型的值。1、实现对接口值方法的调用会执行接口值里存储的用户定义的类型的值对应的方法...原创 2018-10-09 08:31:31 · 116 阅读 · 0 评论 -
类型的本质
在声明一个新类型之后,声明一个该类型的方法之前,需要先回答一个问题:这个类型的本质是什么。如果给这个类型增加或者删除某个值,是要创建一个新值,还是要更改当前的值?如果是要创建一个新值,该类型的方法就使用值接收者。如果要修改当前值,就使用指针接收者。这个答案也会影响程序内部传递这个类型的值的方式:是按值传递还是按指针传递。1、内置类型内置类型是由语言提供的一组类型,其分别是数值类型、字符串类型和...原创 2018-10-09 08:03:18 · 263 阅读 · 0 评论 -
方法
方法给用户定义的类型添加新的行为。方法实际上也是函数,只是在声明时,在关键字func和方法名之间增加了一个参数。可参照如下代码,package mainimport "fmt"type user struct { name string email string}// notify 使用值接受者实现一个方法func (u user) notify() { fmt.Prin...原创 2018-10-09 07:42:39 · 99 阅读 · 0 评论 -
并发
Go语言的并发同步模式来自一个叫做通信顺序进程(Communicating Sequential Processes,CSP)的范型。CSP是一种消息传递模型,通过在goroutine 之间传递数据来传递消息,而不是对数据进行枷锁来实现同步访问。用于在goroutine 之间同步和传递数据的关键数据类型叫做通道(channel)。1、如上图所示,Go 语言运行时会把 goroutine 调度到...原创 2018-10-15 08:25:12 · 121 阅读 · 0 评论 -
数组与切片
1、数组在Go语言里,数组是一个长度固定的数据类型,用于存储一段具有相同的类型的元素的连续块。数组存储的类型可以是内置类型,如整型或者字符串,也可以是某种结构类型。1)数组的创建//先声明,再赋值 var array [5]int array[1] = 3//创建固定长度的数组array := [5]int{1,2,3,4,5}//数组长度由初始化值的数量决定array :=...原创 2018-09-21 08:32:36 · 425 阅读 · 0 评论 -
映射
1 映射的特性映射是一种数据结构,用于存储一系列无序的键值对。映射是无序的结合,意味着没有办法预测键值对被返回的顺序。即使是使用同样的顺序保存键值对,每次迭代映射的时候其顺序也可能不一样。无序的原因是映射的实现使用了散列表。2 创建和初始化 // 创建一个映射,健的类型是string,值的类型是 int dic := make(map[string]int) //创建一个映射,健和值的类...原创 2018-09-26 08:18:18 · 506 阅读 · 0 评论 -
go的工具
go从上图可知,go这个工具提供了很多功能。(1) go buildgo build 是用来编译包和其依赖的包,其只对main包有效,在当前的目录下生成可执行的二进制文件。(2) go installgo install 生成静态库文件,放在GOPATH/pkg目录下,如果为main包,则会生成在GOPATH/pkg目录下, 如果为main包,则会生成在GOPATH/pkg目录下,如...原创 2018-09-20 08:05:48 · 122 阅读 · 0 评论 -
go的基本语法
1、导入带下划线的包名import ( "log" "os" _"packs/chapter2/sample/matchers&a原创 2018-09-19 07:44:56 · 175 阅读 · 0 评论 -
Go中的基准测试
基准测试可以用来识别某段代码的 CPU 或者内存效率问题。基准测试可以被用来测试不同的并发模式或者被用来辅助配置工作池的数量,以保证能最大化系统的吞吐量。package chapter10import ( "fmt" "testing")// BenchmarkSprintf 对 fmt.Sprintf 函数进行基准测试func BenchmarkSprintf(b *testi...原创 2018-10-30 08:16:38 · 947 阅读 · 0 评论