Go语言中文网 为您找到相关结果 1185

golang中并发sync和channel

golang中实现并发非常简单,只需在需要并发的函数前面添加关键字"go",但是如何处理go并发机制中不同goroutine之间的同步与通信,golang 中提供了sync包和channel机制来解决这一问题. sync 包提供了互斥锁这类的基本的同步原语.除 Once 和 WaitGroup 之外的类型大多用于底层库的例程。更高级的同步操作通过信道与通信进行。 type Cond func NewCond(l Locker) *Cond func (c *Cond) Broadcast() func (c *Cond) Signal() func (c *Cond) Wait()type Lockertype Mutex func (m *Mutex) Lock() func (m *Mu...阅读全文

博文 2014-12-08 13:00:01 chenbaoke

Goroutine + Channel 实践

背景 在最近开发的项目中,后端需要编写许多提供HTTP接口的API,另外技术选型相对宽松,因此选择Golang + Beego框架进行开发。之所以选择Golang,主要是考虑到开发的模块,都需要接受瞬时大并发、请求需要经历多个步骤、处理时间较长、无法同步立即返回结果的场景,Golang的goroutine以及channel所提供的语言层级的特性,正好可以满足这方面的需要。 goroutine不同于thread,threads是操作系统中的对于一个独立运行实例的描述,不同操作系统,对于thread的实现也不尽相同;但是,操作系统并不知道goroutine的存在,goroutine的调度是有Golang运行时进行管理的。启动thread虽然比process所需的资源要少,但是多个thread之间...阅读全文

博文 2015-02-25 12:37:01 Qu Xiao

Go语言debug调试

文:http://www.cnblogs.com/yourihua/archive/2012/06/15/2541745.html说明:作为一门静态语言,似乎支持调试是必须的,而且,Go初学者喜欢问的问题也是:大家都用什么IDE?怎么调试?其实,Go是为多核和并发而生,真正的项目,你用单步调试,原本没问题的,可能会调出有问题。更好的调试方式是跟PHP这种语言一样,用打印的方式(日志或print)。当然,简单的小程序,如果单步调试,可以看到一些内部的运行机理,对于学习还是挺有好处的。下面介绍一下用GDB调试Go程序:(目前IDE支持调试Go程序,用的也是GDB。要求GDB 7.1以上)以下内容来自雨痕的《Go语言学习笔记》(下载Go资源):默认情况下,编译过的二进制文件已经包含了 DWARFv...阅读全文

博文 2014-12-14 09:00:07 halcyonbaby

GoLang之协程

GoLang之协程 目前,WebServer几种主流的并发模型: 多线程,每个线程一次处理一个请求,在当前请求处理完成之前不会接收其它请求;但在高并发环境下,多线程的开销比较大; 基于回调的异步IO,如Nginx服务器使用的epoll模型,这种模式通过事件驱动的方式使用异步IO,使服务器持续运转,但人的思维模式是串行的,大量回调函数会把流程分割,对于问题本身的反应不够自然; 协程,不需要抢占式调度,可以有效提高线程的任务并发性,而避免多线程的缺点;但原生支持协程的语言还很少。 协程(coroutine)是Go语言中的轻量级线程实现,由Go运行时(runtime)管理。 在一个函数调用前加上go关键字,这次调用就会在一个新的goroutine中并发执行。当被调用的函数返回时,这个gorouti...阅读全文

博文 2015-05-16 03:00:15 chenny7

golang读写锁RWMutex

读写锁是针对读写的互斥锁 基本遵循两大原则: 1、可以随便读,多个goroutine同时读 2、写的时候,啥也不能干。不能读也不能写 RWMutex提供了四个方法: func (*RWMutex) Lock // 写锁定 func (*RWMutex) Unlock // 写解锁 func (*RWMutex) RLock // 读锁定 func (*RWMutex) RUnlock // 读解锁 一、随便读 package main import ( "sync" "time" ) var m *sync.RWMutex func main() { m = new(sync.RWMutex) // 多个同时读 go read(1) go read(2) time.Sleep(2*time....阅读全文

博文 2015-03-06 23:00:00 白玉雄

Golang 简单理解Channel

什么是channel? channel是Go语言在语言级别提供的goroutine间的通信方式。我们可以使用channel在两个或 多个goroutine之间传递消息。channel是进程内的通信方式,因此通过channel传递对象的过程和调用函数时的参数传递行为比较一致,比如也可以传递指针等。如果需要跨进程通信,我们建议用 分布式系统的方法来解决,比如使用Socket或者HTTP等通信协议。Go语言对于网络方面也有非常完善的支持。 channel是类型相关的。也就是说,一个channel只能传递一种类型的值,这个类型需要在声明channel时指定。如果对Unix管道有所了解的话,就不难理解channel,可以将其认为是一种类 型安全的管道。 (我复制pdf上的。个人理解即是并发编程中各线程...阅读全文

博文 2015-02-09 12:00:07 未来还没来

Scala与Golang的并发实现对比

并发语言俨然是应大规模应用架构的需要而提出,有其现实所需。前后了解了Scala和Golang,深深体会到现代并发语言与旧有的Java、C++等语言在风格及理念上的巨大差异。本文主要针对Scala和Golang这两个我喜爱的并发语言在并发特性上的不同实现,做个比较和阐述,以进一步加深理解。 一. Scala与Golang的并发实现思路Scala语言并发设计采用Actor模型,借鉴了Erlang的Actor实现,并且在Scala 2.10之后,Scala采用的是Akka Actor模型库。Actor模型主要特征如下: “一切皆是参与者”,且各个actor间是独立的; 发送者与已发送消息间解耦,这是Actor模型显著特点,据此实现异步通信; actor是封装状态和行为的对象,通过消息交换进行相互通...阅读全文

博文 2015-04-24 01:00:38 2gua

[go语言] golang的goroutine机制和runtime.GOMAXPROCS

之前对golang的goroutine机制和runtime.GOMAXPROCS不是很理解,今天抽空研究了一下,学习了其他大牛的文章。把自己的理解写下来。如有错误,请指正 golang的goroutine机制有点像线程池: 一、go 内部有三个对象: P对象(processor) 代表上下文(或者可以认为是cpu),M(work thread)代表工作线程,G对象(goroutine). 二、正常情况下一个cpu对象启一个工作线程对象,线程去检查并执行goroutine对象。碰到goroutine对象阻塞的时候,会启动一个新的工作线程,以充分利用cpu资源。所有有时候线程对象会比处理器对象多很多 我们用如下图分别表示P、M、G 在单核情况下,所有goroutine运行在同一个线程(M0)中,...阅读全文

博文 2015-03-08 05:00:01 EthanDorisHope

Go语言TCP Socket编程

Golang的主要 设计目标之一就是面向大规模后端服务程序,网络通信这块是服务端 程序必不可少也是至关重要的一部分。在日常应用中,我们也可以看到Go中的net以及其subdirectories下的包均是“高频+刚需”,而TCP socket则是网络编程的主流,即便您没有直接使用到net中有关TCP Socket方面的接口,但net/http总是用到了吧,http底层依旧是用tcp socket实现的。 网络编程方面,我们最常用的就是tcp socket编程了,在posix标准出来后,socket在各大主流OS平台上都得到了很好的支持。关于tcp programming,最好的资料莫过于W. Richard Stevens 的网络编程圣经《UNIX网络 编程 卷1:套接字联网API》 了,书中...阅读全文

博文 2015-11-18 10:13:26 bigwhite

golang 编译后文件变小的方法

总有人说Go程序“好大”,一个Hello World都1M多。其实,随着程序源码越来越大,编译后的文件并非那么快速的增长,这点大小真心没必要那么在乎,又不是软盘时代。但总有一些人非得想要小点。 首先我们看一下为什么会比其他语言大些: Go 编译的可执行文件都包含了一个运行时(runtime),和我们习惯的Java/.NET VM有些类似。 运行时负责内存分配(Stack Handing、GC Heap)、垃圾回收(Garbage Collection)、Goroutine调度(Schedule)、引用类型(slice、map、channel)管理,以及反射(Reflection)等工作。Go程序进程启动后会自动创建两个goroutine,分别用于执行main入口函数...阅读全文

golang sync WaitGroup

刚才看golang的sync的包,看见一个很有用的功能。就是WaitGroup。 先说说WaitGroup的用途:它能够一直等到所有的goroutine执行完成,并且阻塞主线程的执行,直到所有的goroutine执行完成。 WaitGroup总共有三个方法:Add(delta int),Done(),Wait()。简单的说一下这三个方法的作用。 Add:添加或者减少等待goroutine的数量 Done:相当于Add(-1) Wait:执行阻塞,直到所有的WaitGroup数量变成0 例子: package main import ( "fmt" "sync" "time" ) func main() { var wg sync.WaitGroup for i := 0; i < 5; i ...阅读全文

博文 2014-10-04 19:26:12 u011511092

go程序包源码解读——golang.org/x/net/contex

强烈建议读者先完成http://blog.golang.org/pipelines的阅读,此文对于go的channel的用法会让初学者有一种豁然开朗的感觉。 简介 context是一个在go中时常用到的程序包,google官方开发。特别常见的一个应用场景是由一个请求衍生出的各个goroutine之间需要满足一定的约束关系,以实现一些诸如有效期,中止routine树,传递请求全局变量之类的功能。使用context实现上下文功能约定需要在你的方法的传入参数的第一个传入一个context.Context类型的变量。我们将通过源代码的阅读和一些示例代码来说明context的用法。 文档在此:https://godoc.org/golang.org/x/net/context,另有一篇官方博客http...阅读全文

博文 2015-10-27 15:00:06 xiaohu50

用Go实现的简易TCP通信框架

接触到GO之后,GO的网络支持非常令人喜欢。GO实现了在语法层面上可以保持同步语义,但是却又没有牺牲太多性能,底层一样使用了IO路径复用,比如在LINUX下用了EPOLL,在WINDOWS下用了IOCP。 但是在开发服务端程序的时候,很多都是被动触发的,都是客户端发送来的请求需要处理。天生就是一个event-based的程序。而在GO下,因为并发是作为语言的一部分,goroutine, channel等特性则很容易的使程序员在实现功能时从容的在同步与异步之间进行转换。 因为自己的需要,我针对event-based场景的服务端做了简易的封装。具体代码见这里. 设计原则 因为GO的IO机制和并发原语的原生支持,再加上对网络API的封装,程序员可以简单的实现一个高效的服务端或者客户端程序。一般的实...阅读全文

博文 2014-10-23 03:00:02 concurrency

近期遇到的3个Golang代码问题

近期遇到的3个Golang代码问题 一 23 bigwhite技术志 Channel, GDB, Go, Golang, goroutine, heartbeat, martini, runtime, template, top, Web, 坑, 惯用法, 模板, 调度 No Comments 这两周来业余时间都在用Golang写代码,现在处于这样一个状态:除了脚本,就是Golang了。反正能用golang实现的,都用golang写。 Golang语言相对成熟了,但真正写起来,还是要注意一些“坑”的,下面是这周遇到的三个问题,这里分享出来,希望能对遇到同样问题的童鞋有所帮助。 一、误用定时器,狂占CPU golang中有一个通过channel实现timeout或tick timer的非常id...阅读全文

博文 2015-02-15 18:02:09 bigwhite

Golang编程经验总结

如何选择web框架: 首先Golang语言开发web项目不一定非要框架,本身已经提供了Web开发需要的一切必要技术。当然如果想要ruby里面Rail那种高层次全栈式的MVC框架, Golang里面暂时没有,但是不是所有人都喜欢这种复杂的框架。Golang里面一些应用层面的技术需要自己去组装,比如session,cache, log等等. 可选择的web框架有martini, goji等,都是轻量级的。 Golang的web项目中的keepalive 关于keepalive, 是比较复杂的, 注意以下几点: http1.1 默认支持keepalive, 但是不同浏览器对keepalive都有个超时时间, 比如firefox: 默认超时时间115秒, 不同浏览器不一样; Nginx默认超时时间7...阅读全文

博文 2015-02-04 17:00:02 u013834131

Goroutine(协程)为何能处理大并发?

简单来说:协程十分轻量,可以在一个进程中执行有数以十万计的协程,依旧保持高性能。 进程、线程、协程的关系和区别: 进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度。 线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦由操作系统调度(标准线程是的)。 协程和线程一样共享堆,不共享栈,协程由程序员在协程的代码里显示调度。 堆和栈的区别请参看:http://www.cnblogs.com/ghj1976/p/3623037.html 协程和线程的区别是:协程避免了无意义的调度,由此可以提高性能,但也因此,程序员必须自己承担调度的责任。 执行协程只需要极少的栈内存(大概是4~5KB),默认情况下,线程栈的大小为1MB。 goroutine就是一段代码,一个函数入口,以及在堆...阅读全文

博文 2015-07-23 12:00:03 nop4ss

go runtime.Gosched()的作用分析

untime.Gosched()用于让出CPU时间片。这就像跑接力赛,A跑了一会碰到代码runtime.Gosched()就把接力棒交给B了,A歇着了,B继续跑。 看代码: package main import ( "fmt" "runtime" ) func say(s string) { for i := 0; i < 2; i++ { runtime.Gosched() fmt.Println(s) } } func main() { go say("world") say("hello") } 输出结果: hello world hello 注意结果: 1、先输出了hello,后输出了world. 2、hello输出了2个,world输出了1个(因为第2个hello输出完,主线程就...阅读全文

博文 2015-05-07 10:48:20 baiyuxiong

go channel实现

go channel实现 转载自:http://alpha-blog.wanglianghome.org/2012/04/13/go-channel-implementation/ G语言经过多年的发展,于最近推出了第一个稳定版本。相对于C/C++来说,Go有很多独特之出,比如提供了相当抽象的工具,如channel和goroutine。本文主要介绍channel的实现方式。 简介 channel有四个操作: 创建:c = make(chan int)发送:c <- 1提取:i <- c关闭:close(c) 根据创建方式的不同,channel还可分为有buffer的channel和没有buffer的channel。buffer的大小由make的第二个参数指定,默认为0,即没有buffer。创...阅读全文

博文 2014-10-06 16:37:04 kai_ding

Golang的GC信息

一、GC信息的信息收集 设置环境变量GODEBUG=gctrace=1。 使用方法,如果程序为myserver。正常的启动方法为./myserver,如果需要收集GC信息启动方式如下GODEBUG=gctrace=1 ./myserver。 二、GC信息分析 gc5(6): 11+12+357+77 us, 0 -> 1 MB, 4294 (5261-967) objects, 67/2/0 sweeps, 6(115) handoff, 6(9) steal, 170/56/5 yields gc5(6):表示第5次GC,共有6个线程参与GC。 11+12+357+77 us:表示停止各个goroutine花费时间是11us,释放标记对象所有时间为12us,扫描标记可回收对象花费时间为25...阅读全文

博文 2015-03-27 20:00:01 lyhuzi

我为什么从python转向go

应puppet大拿刘宇的邀请,我去西山居运维团队做了一个简短分享,谈谈为什么我要将我们的项目从python转向go。 坦白的讲,在一帮python用户面前讲为什么放弃python转而用go其实是一件压力蛮大的事情,语言之争就跟vim和emacs之争一样,是一个永恒的无解话题,稍微不注意就可能导致粉丝强烈地反击。所以我只会从我们项目实际情况出发,来讲讲为什么我最终选择了go。 为什么放弃python 首先,我其实得说说为什么我们会选择python。在我加入企业快盘团队之前,整个项目包括更早的金山快盘都是采用python进行开发的。至于为什么这么选择,当时的架构师葱头告诉我,主要是因为python上手简单,开发迅速。对于团队里面大部分完全没服务端开发经验的同学来说,python真的是一个很好的选...阅读全文

博文 2015-05-16 19:54:07 siddontang

一个CGO的问题

写了个CGO的调用,用到了crypto这个库,但是程序有时候会正常运行,有时候又会崩溃,都是在同一个地方崩溃。崩溃的情况下报了这个错误: fatal error: unexpected signal during runtime execution [signal 0xb code=0x1 addr=0xfffffffff80011c0 pc=0x3dd1c6a437] runtime stack: runtime.gothrow(0x6fd250, 0x2a) /usr/local/go/src/runtime/panic.go:503 +0x8e runtime.sigpanic() /usr/local/go/src/runtime/sigpanic_unix.g...阅读全文

Go语言中的管道(Channel)总结

管道(Channel)是Go语言中比较重要的部分,经常在Go中的并发中使用。今天尝试对Go语言的管道来做以下总结。总结的形式采用问答式的方法,让答案更有目的性。 Q1.管道是什么? 管道是Go语言在语言级别上提供的goroutine间的**通讯方式**,我们可以使用channel在多个goroutine之间传递消息。channel是**进程内**的通讯方式,是不支持跨进程通信的,如果需要进程间通讯的话,可以使用Socket等网络方式。 以上是管道的概念,下面我们就看下管道的语法。 Q2.管道的语法? 整个Go语言的语法都比较简洁,管道也不例外,其语法如下所示: 在此应当注意,管道是类型相关的,即一个管道只能传递一种类型的值。管道中的数据是先进先出的。 1 // 声明方式,在此ElemType...阅读全文

博文 2015-03-25 14:00:59 yetuweiba

Go如何杀死goroutine?

在函数里开一个 goroutine 并不会因为函数的结束而退出,所以以下有一段代码是我在网站上找到的,我略作修改,以证明这种办法无法让goroutine退出,在函数终结退出后,依然有routine在奔跑, 请教大家如何杀死goroutine?不甚感激:::: for { go 拜谢() } http://bbs.mygolang.com/thread-18-1-1.html package main import ( "fmt" "runtime" "time" ) func job(ch int, timeout time.Duration) { t := time.NewTimer(time...阅读全文

游戏服务器框架 Leaf/go

Leaf 是一个使用 Go 语言开发的开源游戏服务器框架,注重运行效率 并追求极致的开发效率。Leaf 适用于几乎所有的游戏类型。其主要的特性: * 良好的使用体验。Leaf 总是尽可能的提供简洁和易用的接口,尽可能的提升开发的效率 * 稳定性。Leaf 总是尽可能的恢复运行过程中的错误,避免崩溃 * 多核支持。Leaf 通过模块机制和 [leaf/go](https://github.com/name5566/leaf/tree/master/go) 尽可能的利用多核资源,同时又尽量避免各种副作用 * 良好的模块支持。 一个 Leaf 开发的游戏服务器由多个模块组成(例如 [LeafServer](https://github.com/name5566/leafserver))...阅读全文

Go 1.6 GC improvements 转自google doc

Go 1.6 GC improvements Austin Clements and Rick Hudson 2015-08-13 Go 1.5 is the first release with our new, low-pause concurrent garbage collector (GC). This is a significant stride over past releases and should open up Go to applications where it was previously unsuitable, but there is still plenty of work to do. For 1.6, our primary goal with the...阅读全文

博文 2015-08-14 11:00:07 myml

goroutine与调度器

我们都知道Go语言是原生支持语言级并发的,这个并发的最小逻辑单元就是goroutine。goroutine就是Go语言提供的一种用户态线程,当然这种用户态线程是跑在内核级线程之上的。当我们创建了很多的goroutine,并且它们都是跑在同一个内核线程之上的时候,就需要一个调度器来维护这些goroutine,确保所有的goroutine都使用cpu,并且是尽可能公平的使用cpu资源。 这个调度器的原理以及实现值得我们去深入研究一下。支撑整个调度器的主要有4个重要结构,分别是M、G、P、Sched,前三个定义在runtime.h中,Sched定义在proc.c中。 Sched结构就是调度器,它维护有存储M和G的队列以及调度器的一些状态信息等。 M代表内核级线程,一个M就是一个线程,gorouti...阅读全文

博文 2014-11-13 21:58:16 skoo

Go中优雅的HTTP服务关闭

虽然写出7x24小时不间断运行的服务是一件很酷的事情,但是我们仍然在某些时候,譬如服务升级,配置更新等,得考虑如何优雅的结束这个服务。 当然,最暴力的做法直接就是kill -9,但这样直接导致的后果就是可能干掉了很多运行到一半的任务,最终导致数据不一致,这个苦果只有遇到过的人才能深深地体会,数据的修复真的挺蛋疼,有时候还得给用户赔钱啦。 所以,通常我们都是给服务发送一个信号,SIGTERM也行,SIGINTERRUPT也成,反正要让服务知道该结束了。而服务收到结束信号之后,首先会拒绝掉所有外部新的请求,然后等待当前所有正在执行的请求完成之后,在结束。当然很有可能当前在执行一个很耗时间的任务,导致服务长时间不能结束,这时候就得决定是否强制结束了。 具体到go的HTTP Server里面,如何优...阅读全文

博文 2015-05-16 20:05:15 siddontang

golang fatal error: all goroutines are asleep - deadlock!

channel默认上是阻塞的,也就是说,如果Channel满了,就阻塞写,如果Channel空了,就阻塞读。阻塞的含义就是一直等到轮到它为止。单有时候我们会收到 fatal error: all goroutines are asleep - deadlock! 异常,这是如何呢? 代码例子: package main import "fmt" func main() { channel := make(chan string, 2) fmt.Println("1") channel <- "h1" fmt.Println("2") channel <- "w2" fmt.Println("3") channel <- "c3" // 执行到这一步,直接报 error fmt.Println...阅读全文

博文 2015-02-18 03:00:00 ghj1976

go语言的官方包sync.Pool的实现原理和适用场景

已经使用golang有一段时间,go的协程和gc垃圾回收特性的确会提高程序的开发效率。但是毕竟是一门新语言,如果对于它的机制不了解,用起来可能会蹦出各种潘多拉盒子。今天就讲讲我在项目中用到的sync包的Pool类的使用,以免大家混淆使用。 众所周知,go是自动垃圾回收的(garbage collector),这大大减少了程序编程负担。但gc是一把双刃剑,带来了编程的方便但同时也增加了运行时开销,使用不当甚至会严重影响程序的性能。因此性能要求高的场景不能任意产生太多的垃圾(有gc但又不能完全依赖它挺恶心的),如何解决呢?那就是要重用对象了,我们可以简单的使用一个chan把这些可重用的对象缓存起来,但如果很多goroutine竞争一个chan性能肯定是问题.....由于golang团队认识到这个...阅读全文

博文 2015-06-17 20:06:14 yongjian_lian

实现一个go语言的简单爬虫来爬取CSDN博文(一)

前言 如何实现一个爬虫系统或则简单的小脚本?一般是定义一个入口页面,然后一个页面会有其他页面的URL,于是从当前页面获取到这些URL加入到爬虫的抓取队列中,然后进入到新页面后再递归的进行上述的操作,其实说来就跟深度遍历或广度遍历一样。 golang由于其编译速度很快,而且对并发(goroutine)的天然支持,配合chan的协程处理,可以很好地实现一个稳定高效的爬虫系统. 用到的包 完全不借助第三方的框架,通过go sdk的标准库来实现一个爬虫应用,主要用到的包 net/http 标准库里内建了对http协议的支持,实现了一个http client,可以直接通过其进行get,post等请求 strings 不像java的String是一个引用类型,go语言中的字符串类型是一个内建的基础类型,...阅读全文

博文 2015-12-24 10:00:00 tyBaoErGe

GO语言学习笔记一

GO语言学习笔记一 -------------------------------------------------------------------------- 优势: 1.它是系统级别的语言,静态编译,是C系列语言。 2.具有很多内置库,使用起来和Python很类似。 3.语法足够简单,入门学习成本很低,适合我这样从PHP和Python切换过来的人。 4.速度快,就拿简单的页面来说,我用PHP开发并发能够达到500很好了,但是用Go轻松就到上万,这是无法比拟的性能 提升,而且用Go开发的效率和PHP差不多。 5.出自Google之手,而且有一帮牛人在维护,基于BSD开源,社区活跃。 --------------------------------------------------...阅读全文

博文 2014-10-21 14:00:03 lvshudao

进一步认识golang中的并发

如果你成天与编程为伍,那么并发这个名词对你而言一定特别耳熟。需要并发的场景太多了,例如一个聊天程序,如果你想让这个聊天程序能够同时接收信息和发送信息,就一定会用到并发,无论那是什么样的并发。 并发的意义就是:让一个程序同时做多件事情! 理解这一点非常重要,是的,并发的目的只是为了能让程序同时做另一件事情而已,并发的目的并不是让程序运行的更快(如果是多核处理器,而且任务可以分成相互独立的部分,那么并发确实可以让事情解决的更快)。记得我学C++那时候开始接触并发,还以为每开一个线程程序就会加速一倍呢。。。。 golang从语言级别上对并发提供了支持,而且在启动并发的方式上直接添加了语言级的关键字。我并不会很多语言,而且也没有很多的项目经验,可能从我嘴里说出的比较不会非常客观,但是起码和C/C++...阅读全文

博文 2014-10-25 11:56:37 gophers

Go语言 你可能不知道的十个技巧

1. 匿名结构体 全局组合 1 2 3 4 5 var config struct {//定义一个用于全局配置结构体 APIKey string OAuthConfig oauth.Config } config.APIKey = "BADC0C0A" 数据模板 1 2 3 4 5 6 7 8 data := struct {//匿名结构体的定义 Title string Users []*User }{//同时初始化 title, users, } err := tmpl.Execute(w, data) (比map[string]interface{}消耗更小和更安全) 测试表(用作测试数据构造) 1 2 3 4 5 6 7 8 9 10 var indexRuneTests = []s...阅读全文

博文 2014-10-10 12:00:01 abv123456789

Go 1.5中值得关注的几个变化

Go 1.5中值得关注的几个变化 七 10 bigwhite技术志 bootstrap, GC, Go, Go1.5, Golang, GOPATH, Gopher, GopherCon, GopherCon2015, GOROOT, goroutine, internal, runtime, RussCox, vendor, 垃圾收集器, 汇编, 编译, 编译器, 跨平台编译, 运行时, 链接器 1 Comment 在GopherCon2015开幕之 际,Google Go Team终于放出了Go 1.5Beta1版本的安装包。在go 1.5Beta1的发布说明中,Go Team也诚恳地承认Go 1.5将打破之前6个月一个版本的发布周期,这是因为Go 1.5变动太大,需要更多时间来准备这次...阅读全文

博文 2015-07-14 11:17:30 bigwhite

【转】Go内部实现之timer

原文地址: [timer in Go's runtime](http://www.bigendian123.com/go/2013/09/12/go-runtime-timer/) 我们总是使用sleep()类函数来让线程暂停一段时间,在Go语言里,也是使用Sleep()来暂停goroutine。 那么Go语言的sleep究竟是如何现实的呢?当然你翻看标准库中的time包里面的sleep.go源码时, 你可能会觉得看不明白,因为支持sleep功能的真正实现是在runtime里面。不难想到sleep功能是根据定时器来实现的, 因此接下来看看runtime中的timer究竟长什么样子。 timer的实现主要位于runtime/time.goc文件中。 主要数据结构 ...阅读全文

golang 的 sync.WaitGroup

WaitGroup的用途:它能够一直等到所有的goroutine执行完成,并且阻塞主线程的执行,直到所有的goroutine执行完成。 官方对它的说明如下: A WaitGroup waits for a collection of goroutines to finish. The main goroutine calls Add to set the number of goroutines to wait for. Then each of the goroutines runs and calls Done when finished. At the same time, Wait can be used to block until all goroutines have fini...阅读全文

博文 2015-05-30 03:00:15 ghj1976

Go 1.6中值得关注的几个变化

北京时间2016年2月18日凌晨,在Go 1.5发布 半年后,Go 1.6正式Release 了。与Go 1.5的“惊天巨变”(主要指Go自举)相比,Go 1.6的Change 算是很小的了,当然这也与Go 1.6的dev cycle过于短暂有关。但Go社区对此次发布却甚是重视,其热烈程度甚至超出了Go 1.5。在Dave Cheney的倡导 下,Gophers们在全球各地举行了Go 1.6 Release Party。 Go Core Team也在Reddit上开了一个AMA – Ask Me Anything,RobPike、Russ Cox(Rsc)、Bradfitz等Go大神齐上阵,对广大Gophers们在24hour内的问题有问必答。 言归正传,我们来看看Go 1.6中哪些变化值得...阅读全文

博文 2016-02-21 16:14:03 bigwhite

Golang网络库中socket阻塞调度源码剖析

本文分析了Golang的socket文件描述符和goroutine阻塞调度的原理。代码中大部分是Go代码,小部分是汇编代码。完整理解本文需要Go语言知识,并且用Golang写过网络程序。更重要的是,需要提前理解goroutine的调度原理。 1. TCP的连接对象: 连接对象: 在net.go中有一个名为Conn的接口,提供了对于连接的读写和其他操作: type Conn interface { Read(b []byte) (n int, err error) Write(b []byte) (n int, err error) Close() error LocalAddr() Addr RemoteAddr() Addr SetReadDeadline(t time.Time) err...阅读全文

博文 2015-10-15 09:48:14 华子

Go语言内置函数大全

载自 http://www.fenby.com/blog/blog/113 Package builtin import "builtin" Overview Index Overview ▾ Package builtin provides documentation for Go's predeclared identifiers. The items documented here are not actually in package builtin but their descriptions here allow godoc to present documentation for the language's special identifiers. Index ▾ Const...阅读全文

博文 2014-11-02 11:00:01 dhljs

如何优雅地等待所有的goroutine退出

Table of Contents 1. 通过Channel传递退出信号 2. 使用waitgroup goroutine和channel是Go语言非常棒的特色,它们提供了一种非常轻便易用的并发能力。但是当您的应用进程中有很多goroutine的时候,如何在主流程中等待所有的goroutine 退出呢? 1 通过Channel传递退出信号 Go的一大设计哲学就是:通过Channel共享数据,而不是通过共享内存共享数据。主流程可以通过channel向任何goroutine发送停止信号,就像下面这样: func run(done chan int) { for { select { case <-done: fmt.Println("exiting...") done <- 1 break de...阅读全文

Golang实现简单tcp服务器02 -- 实现echo服务器/客户端

用Golang实现 echo服务器/客户端 本节我们就从实现一个简单的echo的服务端/客户端来入手, 了解golang的实现tcp长连接服务器的具体细节. 首先, 我们先列一下**服务端的实现思路及步骤**:1. 创建一个套接字对象, 指定其IP以及端口.2. 开始监听套接字指定的端口.3. 如有新的客户端连接请求, 则建立一个goroutine, 在goroutine中, 读取客户端消息, 并转发回去, 直到客户端断开连接4. 主进程继续监听端口. 我们可以在实验环境的主文件夹中, 建立一个名为server.go的文件, 在其中编写服务器端程序代码服务端程序清单如下: server.go package main import ( "bufio" "fmt" "net" "time" )...阅读全文

博文 2015-06-02 23:00:16 victoriest

Go语言的堆栈分析

本文为理解翻译,原文地址:http://www.goinggo.net/2015/01/stack-traces-in-go.html Introduction 在Go语言中有一些调试技巧能帮助我们快速找到问题,有时候你想尽可能多的记录异常但仍觉得不够,搞清楚堆栈的意义有助于定位Bug或者记录更完整的信息。 本文将讨论堆栈跟踪信息以及如何在堆栈中识别函数所传递的参数。Functions 先从这段代码开始: Listing 1 01 package main 02 03 func main() { 04 slice := make([]string, 2, 4) 05 Example(slice, "hello", 10) 06 } 07 08 func Example(slice []str...阅读全文

博文 2015-02-15 03:00:01 zeeman

Golang中Timer的陷阱

Golang的Timer类,是一个普遍意义上的定时器,它有着普通定时器的一些特性,例如: 给定一个到期时间,和一个回调函数,到期后会调用回调函数 重置定时器的超时时间 停止定时器 Golang的Timer在源码中,实现的方式是以一个小顶堆来维护所有的Timer集合。接着启动一个独立的goroutine,循环从小顶堆中的检测最近一个到期的Timer的到期时间,接着它睡眠到最近一个定时器到期的时间。最后会执行开始时设定的回调函数。Timer到期之后,会被Golang的runtime从小项堆中删除,并等待GC回收资源。 下面给出实际的代码: package main import ( "time" "fmt" ) func main() { timer := time.NewTimer(3 * t...阅读全文

博文 2015-04-24 12:15:20 华子

我为什么从 Python 转向 Go?

作者微博:http://weibo.com/p/1005052755890521 原文地址:http://toutiao.io/r/rnmoe 应puppet大拿刘宇的邀请,我去西山居运维团队做了一个简短分享,谈谈为什么我要将我们的项目从python转向go。 坦白的讲,在一帮python用户面前讲为什么放弃python转而用go其实是一件压力蛮大的事情,语言之争就跟vim和emacs之争一样,是一个永恒的无解话题,稍微不注意就可能导致粉丝强烈地反击。所以我只会从我们项目实际情况出发,来讲讲为什么我最终选择了go。 为什么放弃python 首先,我其实得说说为什么我们会选择python。在我加入企业快盘团队之前,整个项目包括更早的金山快盘都是采用python进行开发的。至于为什么这么选择,当...阅读全文

博文 2015-06-16 16:00:00 codemanship

[Golang]网络游戏协议处理框架

简介:本文描述了使用Go语言实现的、适应于Go语言并发模型的一种支持多路复用的网络协议处理框架,并提供了框架的代码实现。作者将这种框架用于网络游戏服务器中的协议处理,但也可用于其他领域。应用背景: 在网络游戏服务器设计中,一般都会遇到协议多路复用的场景。比如登录服务器和玩家客户端之间有1:N的多个TCP连接;登录服务器和游戏服务器之间是1:1的TCP连接。玩家登录游戏的大致流程是这样的:玩家连接登录服务器登录服务器向数据库请求玩家数据登录服务器获取到玩家数据,把玩家数据转发给游戏服务器进行加载包括创建玩家对象等登录服务器获取到加载成功回应后,通知玩家客户端可以进入游戏世界在3和4中,因为登录服务器和游戏服务器通常只有一个TCP连接,所有玩家数据都是通过这个连接进行传输,所以需要从协议包中区...阅读全文

博文 2015-06-19 16:01:41 abv123456789

golang select 退出结束goroutine

开启了多个协程 其中一个协程满足条件后终止select, 原以为其他的协程会在后台系统中继续悄悄运行 直到主进程关闭而关闭 。 做一实验发现select 监听退出 会关闭所有监听的goroutine package main import ( "fmt" "time" ) var stop bool = false func main() { ch := make(chan int, 0) ch2 := make(chan int, 0) defer func() { close(ch) close(ch2) }() go func() { ch <- 1 }() for i := 0; i <= 20; i++ { go func(ch2 chan int) { for { fmt.Pri...阅读全文

博文 2015-01-22 13:00:01 wangxusummer

Go的语言特性总结

写在前面: 近来关于对Golang的讨论有很多,七牛的几个大牛们也断定Go语言在未来将会快速发展,并且很可能会取代Java成为互联网时代最受欢迎的编程语言。Go语言是google推出的编程语言,在已经成功的给世人创造了改变人们生活的操作系统之后,google似乎感觉有必要再为世人带来一款强大的编程语言,而Go语言依靠自己众多友好的特性也不负众望正在被开发者接触,我有幸在学习高性能并发编程的时候认识了Go语言,在了解了Go的一些特性之后决定系统的学习一番。我发现关于Go的学习资料并不多,以至于我需要自己写一些东西。这里的内容大多来自七牛团队的《Go语言编程》一书。这里也会按照书中组织的章节进行学习。当然如果一些知识点事互联网上已经有的,这里直接进行转载了。 -Written by Lingta...阅读全文

博文 2015-05-02 00:00:14 u011321908

Go RPC Inside (client)

Go语言标准库能够自带一个rpc框架还是非常给力的,这可以很大程度的降低写后端网络通信服务的门槛,特别是在大规模的分布式系统中,rpc基本是跨机器通信的标配。rpc能够最大程度屏蔽网络细节,让开发者专注在服务功能的开发上面。下面介绍Go语言rpc框架的客户端内部实现. Go rpc客户端的逻辑很简单,大体上,就是将一个个的调用请求序列化后原子的发送给服务器,然后有一个专门的gorutine等待服务器应答,这个goroutine会将收到的每个应答分发给对应的请求,这就完成了一次rpc调用。 调用入口 func NewClient(conn io.ReadWriteCloser) *Client func (client *Client) Call(serviceMethod string, a...阅读全文

博文 2014-11-08 12:49:15 skoo

WebSocket 和 Golang 实现聊天功能

本文同步至 http://www.waylau.com/go-websocket-chat/ 这个示例应用程序展示了如何使用 WebSocket, Golang 和 jQuery 创建一个简单的web聊天应用程序。这个示例的源代码在 https://github.com/waylau/goChat 。 Running the example 运行示例 这个示例需要 Golang 开发环境。 该页面描述如何安装开发环境。 一旦你去启动和运行,您可以下载、构建和运行的例子, 使用命令: go get gary.burd.info/go-websocket-chat go-websocket-chat 在支持 websocket 的浏览器尝试打开 http://127.0.0.1:8080/ 启动...阅读全文

博文 2014-11-19 09:00:02 waylau