golang

【go语言】Goroutines 并发模式(一)

前提是你 提交于 2019-12-04 23:32:43
前言 由于前一阶段实习中接到的项目的告一段落,不知不觉便多出了许多空余的时间,于是就想总结一下最近因为个人兴趣而学习的一些东西。从这篇文章开始以及后面陆续的几篇关于GO语言的文章,均是博主最近对GO语言学习过程中的一些感悟、总结,类似于学习笔记的东西。记录下来并整理成博客一为对学习的知识做一个整理,二为分享出来给大家(因为国内关于GO语言的中文资料比较少),由于博主能力和知识有限,难免有所靡误,还望勘正。 由于Go最近一系列出色的表现,从一开始Go便紧紧地吸引住了我的眼球。类似于Erlang、Scala等语言,Go也是天生为并发而设计的语言,Go有着许多在原生层面对并发编程进行支持的优秀特性,比如大名鼎鼎的Goroutines、Channels、Select等原生特性。那么废话不多说,这一篇主要是对GO语言中的并发编程模式做一个粗略的归纳总结,文中示例参考自golang conference中的一些演讲和博客,涉及到的Go语言的语法知识细节将予以略去。Go语言语法请参考 http://golang.org/ 几点强调之处 1. 并发而非并行 首先我们要明确两个名词:并发(Concurrency)、并行(Parallelism)。这两个词可能大家经常搞混淆,因为这两个词所标书的意思太过相近,但是前者更加偏向于设计(Design),而后者更加偏向于结构(Structure)。

go revel 简单性能测试

泪湿孤枕 提交于 2019-12-04 23:31:02
用revel创建的new创建了一个最简单的示例app,并用ab做简单的性能测试。设置并发数为1000。 结果如下: dev模式下运行:1200次/每秒 prod模式下运行:4800次/每秒 默认创建的app只能使用单个cpu,对多核多cpu服务器来说是个资源浪费,通过修改init.go 在其中添加如下代码: runtime.GOMAXPROCS(runtime.NumCPU()) 再次测试后,得到测试数据为:17500/每秒。 另:要做性能测试或者正式部署到生产环境之前别忘了把watch设置为false,开发状态下开启watch很爽,修改了代码不需要重启服务,revel发现代码发生了更改会自动重新编译,返回新的结果,但是带来的代价是性能剧降。我忘了关闭此功能做性能测试的结果是从18000次/每秒降到600次/每秒。 来源: oschina 链接: https://my.oschina.net/u/221218/blog/148365

golang命令行参数解析

随声附和 提交于 2019-12-04 23:30:20
golang的命令行参数解析,推荐两种。一个是 os.Args ,另一个是使用 flag 模块 os.Args package main import ( "fmt" "os" ) func main() { args := os.Args //使用go run xx.go 1 2 3 xx aaa bbb ccc ddd eee //那么args就是[xx.exe 1 2 3 xx aaa bbb ccc ddd eee] //并且全部是string类型 fmt.Println(args) } flag flag模块可以支持使用关键字的方式指定参数 package main import ( "flag" "fmt" ) func main() { //flag.Type里面接受三个参数,指定的名字,默认值,描述信息 Name := flag.String("name", "mashiro", "姓名") Age := flag.Int("age", 16, "年龄") Has_bf := flag.Bool("has_bf", false, "有男朋友?") //解析 flag.Parse() /* 我们在命令行中便可以通过name satori age 16 has_bf false这种方式指定 当然还可以使用其他方式比如 --name satori, -name

跟着猫哥学Golang[7] - Map

元气小坏坏 提交于 2019-12-04 23:25:15
大多数现代化的编程语言都有个类似map的概念,大意就是映射,Go语言也不能例外。 1. Golang里,map映射键到值,以猫哥的粗浅认识,map的作用类似于哈希表或者Python里的字典,只不过比后两者用得更广泛。 map在Golang里是一种数据类型,与Golang的结构体类似,map必须先声明“键值”类型,然后在使用之前必须用 make 来创建。来看个例子: package main import "fmt" func main() { //var m map[int]string 其实直接定义也可以的 m := make(map[int]string) m[0]="cero" m[1]="uno" m[2]="dos" fmt.Println(m) } #输出: map[2:dos 0:cero 1:uno] 是不是类似哈希表?存储都是随机的。 2. 如果顶层类型只有类型名的话,可以在文法的元素中省略键名。不过键名不能取消。 package main import "fmt" type Person struct { Name string Age int Gender string } var m1 = map[int]Person { 1: {"Li Lei", 14, "male"}, 2: {"Han Meimei", 14, "female"}, } func

跟着猫哥学Golang[6] - 结构体

百般思念 提交于 2019-12-04 23:23:26
非常类似于C语言,Golang中的一个结构体( struct )就是一个字段的集合。 1. Golang定义结构体很简单: type XXX struct { ...... } 访问结构体的变量,直接用点号“.”连接。来看个简单的例子: package main import "fmt" type person struct { Name string Age int Gender string } func main() { fmt.Println(person{"Tom", 22, "male"}) var Jerry person Jerry.Name = "Jerry" Jerry.Age = 21 Jerry.Gender = "male" fmt.Println(Jerry) } #输出: {Tom 22 male} {Jerry 21 male} 2. 不得不说的指针 提到Golang的结构体,就不得不提到指针,又是很类似C语言的,&取地址,*取内容。 首先,Golang没有指针运算。结构体字段可以通过结构体指针来访问,通过指针间接的访问是透明的。 非结构体没有指针运算?留个小小疑问自己探索吧。 package main import "fmt" type person struct { Name string Age int Gender string } func

Golang基础学习(与java对比)

吃可爱长大的小学妹 提交于 2019-12-04 23:19:05
Golang基础 slice ​ 创建一个slice(切片) slice := [] int {lenth, 'b' , 'c' , 'd' } 与java数组不同的是: arr := [5 ] int {1 ,2 ,3 } 必须定死长度,否则会报错 non-constant array bound length slice 有一种是java中数据和list的结合体的感觉 对于 slice 有几个有用的内置函数: len 获取 slice 的长度 cap 获取 slice 的最大容量 append 向 slice 里面追加一个或者多个元素,然后返回一个和 slice 一样类型的 slice copy 函数 copy 从源 slice 的 src 中复制元素到目标 dst ,并且返回复制的元素的个数 ​ 总结:slice 和数据的区别在于 有没有定义长度 map ​ 创建一个map(与java基本类似),只是通过 maps1[key1] 获得结果的时候,有第二个参数(布尔值),可以判断是否这个key是不是存在,当然也可以只返回一个参数 maps1 := make ( map [ string ] string ) key1 := "key1" maps1[key1] = key1 s,ok := maps1[key1] if ok { fmt.Println( "hava key [

几款Golang IDE对比

依然范特西╮ 提交于 2019-12-04 23:18:31
Go语言目前已经在开发者中越发的流行,自然很多人都在寻找合适的IDE来实现代码语法高亮、自动补全以及其他编辑特性。 下面就几种常用的IDE进行对比介绍: 1. Sublime text 这个文本编辑器在开发者中较为普及,应该说sublime并非一个完全成熟的IDE,但是它具备很多语言的扩展插件,比如python、lua等,其中有一个插件GoSublime专门针对go语言,GoSublime提供了语法高亮、自动补全等功能,这些功能使得Sublime Text成为一很实用的Go IDE。 2. IntelliJ IntelliJ IDE由Jetbrains提供,在java开发者中非常流行,其自带的Go插件支持语法高亮显示、代码补全、自动编译以及子库支持。这就使得你可以很方便地将项目拆分成多个包的同时,你可以一个单独的IDE中浏览它们。 它有一个非常好用的功能,插件使用了突出显示来显示未使用的变量或包(如下图示中的hdea变量目前是未使用的变量)。 3. LiteIDE LiteIDE目前也是一个专门针对Golang的IDE了,我也在使用它,功能很全面,具备语法高亮、自动补全、自动编译、调试、包浏览及管理。 调试器在后台使用的gdb,这样你可以方便地打印变量值、查看当前堆栈信息。 4. Intype Intype是仅windows下支持的文本编辑器

golang中 = 和 :=区别

北城余情 提交于 2019-12-04 23:18:15
[color=red][b]= 是赋值语句 :=是声明类型(编译器帮你做的)并赋值。[/b][/color] 1、=要和var 关键字一起使用。var可以在函数中使用,也可以在函数外使用。 :=只能在函数中使用,所以只能定义局部变量。 2、用var定义之后,用=赋值之后,还可以改变。但是用:=定义的变量不能改变值(也就是b:="q",在函数中不能再重新这样定义 b:="s",但是可以b="s") 3、var和=可以平行定义并赋值: 例如: var p, q float32 = 1.1, 2.2 :=也可以这样做: b, f := "q", 1 来源: CSDN 作者: studypi 链接: https://blog.csdn.net/studypi/article/details/84908228

golang语言基础篇

我的未来我决定 提交于 2019-12-04 23:17:57
go 语言特性: ◆ 自动垃圾回收 具备系统自动释放资源 ◆更丰富的内置类型 map 类型、 slice 类型 ( 类似 vector) ◆函数多返回值 跟 lua/erlang 一样,支持函数多返回值,优化输入输出参数、结构体参数等传递 ◆错误处理 defer/recover/panic, defer 用于资源的释放, go 语言不提供构造和析构, recover 截取错误处理流程,一般在使用 defer 的关键字函数中使用;若在无异常的 goroutine 中使用 recover ,会导致此 goroutine 所在的进程打印错误信息后,直接退出 ◆匿名函数 a := fun() / a(); ◆类型、接口 类型 struct ,类似 C 的结构体,但不支持继承和重载; 接口:非入侵式接口、 interface{} 作为函数参数,可传递任何类型 ◆并发 吸取 erlang 语言的面向消息编程机制,所有的数据交互都用 goroutine 的消息传递 ◆反射 模仿 java 语言的反射特性,但不像 java 内置类型工厂 ◆语言的交互性 go 语言通过 Cgo 库,可混合编写 C 语言代码 golang 并发: golang 为实现高并发性,引入了 goroutine ,通过 channel 模式用 CSP (通信顺序进程, Communicating Sequential

golang优秀开源框架和库

♀尐吖头ヾ 提交于 2019-12-04 23:16:13
作者:承诺一时的美丽 链接:https://www.jianshu.com/u/6719426bf97e 來源:简书 音频和音乐 用于操纵音频的库。 flac - Native Go FLAC解码器。 flac - Native Go FLAC解码器。 gaad - Native Go AAC比特流解析器。 go-sox - 用于go的libsox绑定。 go_mediainfo - 用于go的libmediainfo绑定。 gosamplerate - 用于go的libsamplerate绑定。 id3v2 - Go的快速稳定的ID3解析和编写库。 malgo - 迷你音频库。 minimp3 - 轻量级MP3解码器库。 mix - 用于音乐应用的基于序列的Go-native音频混音器。 mp3 - Native Go MP3解码器。 音乐理论 - Go中的音乐理论模型。 PortAudio - 用于PortAudio音频I / O库的绑定。 portmidi - 为PortMidi绑定绑定。 taglib - 用于taglib的绑定。 vorbis - “Native”Go Vorbis解码器(使用CGO,但没有依赖关系)。 波形 - Go包能够从音频流生成波形图像。 身份验证和OAuth 用于实现认证方案的库。 authboss - 用于Web的模块化身份验证系统