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

golang中time包用法

time包中包括两类时间:时间点(某一时刻)和时常(某一段时间) 1时间常量(时间格式化) const ( ANSIC = "Mon Jan _2 15:04:05 2006" UnixDate = "Mon Jan _2 15:04:05 MST 2006" RubyDate = "Mon Jan 02 15:04:05 -0700 2006" RFC822 = "02 Jan 06 15:04 MST" RFC822Z = "02 Jan 06 15:04 -0700" // RFC822 with numeric zone RFC850 = "Monday, 02-Jan-06 15:04:05 MST" RFC1123 = "Mon, 02 Jan 2006 15:04:05 MST...阅读全文

博文 2014-11-26 17:47 chenbaoke

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-01 15:19 chenbaoke

Goroutine + Channel 实践

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

go语言使用redis —— redigo

redis的client有好多好多,go语言的client在redis官方有两个推荐,radix和redigo。选择哪一个好呢?确实很纠结,后来掷硬币决定选择redigo了。 redis、go、redigo的安装就不需要提了,不能强行增加篇幅。 redigo使用起来很人性化,api设计的符合直觉,我对redis了解较少,使用过程中基本没有遇到障碍。 redigo的使用入门可以去查godoc:http://godoc.org/github.com/garyburd/redigo/redis 接下来就是毫无技术含量的贴代码了: 连接redis我一般是这样写的: 1 c, err := redis.Dial("tcp", "127.0.0.1:6379") 2 if err != nil { 3 ...阅读全文

博文 2015-07-23 16:37 wolfred7464

正确使用Go的Timer

我们总是会使用Timer去执行一些定时任务,最近在Go语言的定时器使用上面不小心踩到一点问题,这里记录一下。 go demo(input) func demo(input chan interface{}) { for { select { case msg <- input: println(msg) case <-time.After(time.Second * 5): println("5s timer") case <-time.After(time.Second * 10): println("10s timer") } } } 写出上面这段程序的目的是从 input channel 持续接收消息加以处理,同时希望每过5秒钟和每过10秒钟就分别执行一个定时任务。但是当你执行这段程序...阅读全文

GoLang之协程

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

博文 2015-05-15 16:35 chenny7

GO使用SMTP发送邮件

核心代码:smtp.SendMail(host, auth, user, send_to, msg),auth := smtp.PlainAuth("", user, password, hp[0]) 可行方案:使用企业邮箱的SMTP发送邮件,host :="smtp.exmail.qq.com:25",因此需要一个企业邮箱的账号和密码 直接上代码: main.go package main import ( "fmt" "net/smtp" "strings" ) func SendToMail(user, password, host, to, subject, body, mailtype string) error { hp := strings.Split(host, ":") a...阅读全文

Go学习笔记之:for循环

for循环是Go语言唯一的循环结构。这里有三个基本的for循环类型。 package main import "fmt" func main() { // 最基本的一种,单一条件循环 // 这个可以代替其他语言的while循环 i := 1 for i <= 3 { fmt.Println(i) i = i + 1 } // 经典的循环条件初始化/条件判断/循环后条件变化 for j := 7; j <= 9; j++ { fmt.Println(j) } // 无条件的for循环是死循环,除非你使用break跳出循环或者 // 使用return从函数返回 for { fmt.Println("loop") break } } 输出结果 1 2 3 7 8 9 loop 在后面的例子中,你将...阅读全文

博文 2014-11-26 00:21 Goopand

Scala与Golang的并发实现对比

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

golang学习之指针、内存分配

1 func pointer_test() { 2 //空指针,输出为nil 3 var p *int 4 fmt.Printf("p: %v\n", p) 5 //指向局部变量,变量值初始为0 6 var i int 7 p = &i 8 fmt.Printf("p: %v,%v\n", p, *p) 9 //通过指针修改变量数值 10 *p = 8 11 fmt.Printf("p: %v,%v\n", p, *p) 12 //数组的初始化及输出 13 m := [3]int{3, 4, 5} 14 fmt.Printf("m:%v--%v,%v,%v\n", m, m[0], m[1], m[2]) 15 //指针数组的初始化及输出 16 //j, k, l := 3, 4, 5 17...阅读全文

博文 2015-03-18 13:39 neujie

Golang 简单理解Channel

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

博文 2015-02-09 11:25 未来还没来

近期遇到的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...阅读全文

golang:高性能消息队列moonmq的简单使用

在上一篇moonmq的介绍中(这里),我只简短的罗列了一些moonmq的设计想法,可是对于怎样使用并没有具体说明,公司同事无法非常好的使用。 对于moonmq的使用,事实上非常easy,例子代码在这里,我们仅仅须要处理好broker,consumer以及publisher的关系就能够了。 首先,我们须要启动一个broker,由于moonmq如今仅仅支持tcp的自己定义协议,所以broker启动的时候须要指定一个listen address。 #启动broker ./simple_broker -addr=127.0.0.1:11182 启动了broker之后,我们就能够向该broker发送消息 #向test这个queue发送 hello msg ./simple_publisher -add...阅读全文

博文 2014-06-04 12:03 zfyouxi

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。创...阅读全文

Golang的演化历程

Golang的演化历程 十 25 bigwhite技术志 ANSI-C, BCPL, C, Channel, Concurrency, CSP, Go, Golang,Google, Package, RobPike, UTF8, 包, 并发编程, 标准C, 标准库, 素数筛 暂无评论 本文来自Google的Golang语言设计者之一Rob Pike大神在GopherCon2014大会上的开幕主题演讲资料“Hello, Gophers!”。Rob大神在这次分 享中用了两个生动的例子讲述了Golang的演化历程,总结了Golang到目前为止的成功因素,值得广大Golang Programmer & Beginner学习和了解。这里也用了"Golang的演化历程"作为标题。 1、Hello Go...阅读全文

博文 2014-11-25 23:03 anlun

Go程序如何安全退出(CTRL+C)

http://m.oschina.net/blog/125853 如果是命令行程序需要退出, CTRL+C是最直接的方法. C语言如何处理CTRL+C CTRL+C会向命令行进程发送中断信号, 在C语言的中的signal函数可以注册信号的处理函数. signal函数的签名如下: void (*signal(int sig, void (*func)(int)))(int); 比如, 我们要处理CTRL+C对应的SIGINT信号: #include #include #include void sigHandle(int sig) { switch(sig) { case SIGINT: printf("sig...阅读全文

博文 2014-10-17 16:19 leonpengweicn

go语言实现线程池

话说真的好久没有写博客了,最近赶新项目,工作太忙了。这一周任务比较少,又可以随便敲敲了。 逛论坛的时候突发奇想,想用go语言实现一个线程池,主要功能是:添加total个任务到线程池中,线程池开启number个线程,每个线程从任务队列中取出一个任务执行,执行完成后取下一个任务,全部执行完成后回调一个函数。 不知道有没有卵用,但是我尝试用它开启3个线程,下载10个文件,效果还是不错的。第一次写这方面的东西,可能写得不好。 思路就是把任务放到channel里,每个线程不停的从channel中取出任务执行,并把执行结果写入另一个channel,当得到total个结果后,回调函数。 上一发代码: 1 type GoroutinePool struct { 2 Queue chan func() err...阅读全文

博文 2015-07-22 15:32 wolfred7464

[Golang]妙用channel

channel 是 golang 里相当有趣的一个功能,在我使用 golang 编码的经验里,大部分事件都会是在享受 channel 和 goroutine 配合的乐趣。所以本文主要介绍 channel 的一些有趣的用法。这里有 Oling Cat 翻译的Go编程语言规范里关于 channel(信道)的描述:信道提供了一种机制,它在两个并发执行的函数之间进行同步,并通过传递(与该信道元素类型相符的)值来进行通信。这个个描述又乏味、又枯燥。在我第一次阅读的时候,完全不明白这到底是个什么玩意。事实上,可以认为 channel 是一个管道或者先进先出队列,非常简单且轻量。channel 并不是 Golang 首创的。它同样作为内置功能出现在其他语言中。在大多数情况下,它是一个又大、又笨、又复杂的...阅读全文

博文 2015-03-06 11:20 abv123456789

go语言25个关键字总结

var和const :变量和常量的声明 var varName type 或者 varName : = value package and import: 导入 func: 用于定义函数和方法 return :用于从函数返回 defer someCode :在函数退出之前执行 go : 用于并行 select 用于选择不同类型的通讯 interface 用于定义接口 struct 用于定义抽象数据类型 break、case、continue、for、fallthrough、else、if、switch、goto、default 流程控制 chan用于channel通讯 type用于声明自定义类型 map用于声明map类型数据 range用于读取slice、map、channel数...阅读全文

博文 2013-07-10 16:54 T_star

Go 语言中的 new() 和 make()的区别

本文是看了文章之后的心得。 在此感谢。 概述 Go 语言中的 new 和 make 一直是新手比较容易混淆的东西,咋一看很相似。不过解释两者之间的不同也非常容易。 他们所做的事情,和应用的类型也不相同。 二者都是用来分配空间。 new 函数 new 是内建函数,函数原型为 func new(Type) *Type 官方文档描述为: The new build-in function allocates memory(仅仅分配空间). The first argument is a type, not a value, and the value returned is a pointer to a newly allocated zero value of that type. 翻译如下: ...阅读全文

博文 2015-03-23 09:36 xiaorenwuzyh

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

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

博文 2015-03-25 13:47 yetuweiba

google hosts

google hosts 2015.2.16更新,本文只提供google相关服务的hosts,目前有效,失效后会及时更新 注1:请使用chrome浏览器,并在地址栏里输入chrome://flags/,然后查找QUIC,启用该协议,同时建议启用SPDY/4,能让访问更流畅。 注2:请使用https的方式访问,比如:https://www.google.com 注3:默认可能会跳转到www.google.com.hk,如果.hk访问困难,请使用:https://www.google.com/ncr 方式访问,禁止国别跳转。 ====更新分界线,复制下面内容到hosts文件即可===== #google hosts 2015.2.15 by 360kb.com #base services 64...阅读全文

博文 2015-02-27 15:21 yudishow

不用翻墙也可以使用Google及Gmail,不错!!

google hosts 2015.1.5 更新,本文只提供google相关服务的hosts,目前有效,失效后会及时更新。 注1:请使用chrome浏览器,并在地址栏里输入 chrome://flags/,然后查找QUIC,启用该协议,同时建议启用SPDY/4,能让访问更流畅。 注2:请使用https的方式访问,比如:https://www.google.com 注3:默认可能会跳转到www.google.com.hk,如果.hk访问困难,请使用:https://www.google.com/ncr 方式访问,禁止国别跳转。 ====更新分界线,复制下面内容到hosts文件即可===== #google hosts 2015 by 360kb.com #base services 64.23...阅读全文

博文 2015-01-06 14:18 骏弛

Effective Go

自:https://golang.org/doc/effective_go.html Effective Go IntroductionExamplesFormattingCommentaryNamesPackage namesGettersInterface namesMixedCapsSemicolonsControl structuresIfRedeclaration and reassignmentForSwitchType switchFunctionsMultiple return valuesNamed result parametersDeferDataAllocation with newConstructors and composite literalsAllocati...阅读全文

博文 2014-11-27 15:41 leonzhouwei

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-17 11:26 ghj1976

go语言示例-Timer计时器的用法

计时器用来定时执行任务,分享一段代码: package main import "time" import "fmt" func main() { //新建计时器,两秒以后触发,go触发计时器的方法比较特别,就是在计时器的channel中发送值 timer1 := time.NewTimer(time.Second * 2) //此处在等待channel中的信号,执行此段代码时会阻塞两秒 <-timer1.C fmt.Println("Timer 1 expired") //新建计时器,一秒后触发 timer2 := time.NewTimer(time.Second) //新开启一个线程来处理触发后的事件 go func() { //等触发时的信号 <-timer2.C fmt.Print...阅读全文

博文 2015-03-03 09:03 baiyuxiong

GO语言学习笔记一

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

博文 2014-10-21 13:27 lvshudao

O2O,商城go2o

Go2o ================ # What's Go2o # Golang combine simple o2o DDD domain-driven design realization, including multi-channel (businesses), multi-store, multi-member commodity,Promotions, orders, coupons implementation also includes a mini-framework in package "ops/cf", providing ORM, Reporting, Web Framework,Rpc Framework. # Deploy # ##...阅读全文

开源项目 2014-12-22 10:01:04

分享一个Golang 学习站点:Go by Example,示例,源码,注释

分享一个Golang 学习站点:Go by Example,示例,源码,注释 很不错的一个网站和工具。主要内容包括: 1、为 Golang 各个知识点而写的小程序(放在 play.golang.org ); 2、适当的注释; 3、整站开源,从github clone 后,读者可利用内建的工具生成本地静态文件,甚至可以生成一个网站。 网址:https://gobyexample.com/ 源码:https://github.com/mmcgrana/gobyexample 知识点目录 Hello World Values Variables Constants For If/Else Switch Arrays ...阅读全文

Go 语言教程实战

安装在线教程 由于墙,golang.org 国内无法访问,其在线教程也一样 tutorial.golang.org http://go-tour-zh.appspot.com/ 可以在本机运行, 先安装Go 编译器 http://code.google.com/p/go/downloads/list 然后安装教程 go get code.google.com/p/go-tour/gotour 或者中文的 go get bitbucket.org/mikespook/go-tour-zh/gotour 最后执行安装产生的 gotour 执行文件,即可在http://localhost:3999 打开教程。 一些练习的答案 #46 练习:斐波纳契闭包 package main import "f...阅读全文

博文 2012-12-09 14:49 mebusw

golang 速度限制,time.Tick(time.Second*2) channel,隔2秒后继续执行

package main import ( "fmt" "time" ) func main() { requests := make(chan int, 5) for i := 1; i <= 2; i++ { requests <- i } close(requests) limiter := time.Tick(time.Millisecond * 200) for req := range requests { //会循环两次,前面往requests channel中发送了两个值 <-limiter //执行到这里,需要隔 200毫秒才继续往下执行,time.Tick(timer)上面已定义 fmt.Println("request", req, time.Now()) } burs...阅读全文

博文 2015-04-17 14:41 benlightning

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

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

博文 2015-12-21 23:47 tyBaoErGe

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-05-12 17:42 dhljs

mapreduce.go源码浅析 MIT 6.824 Spring

这学期选了《分布式系统导论》,实验部分和MIT 6.824 Spring 2015 一样,请戳, 再加上对我来说很困难的课前reading以及课后作业,压力巨大:( 实验共分5部分,根据助教往年评分来看,难度呈线性递增。 由于MIT提供的代码是由go语言所写,所以在着手实验前,你需要了解一下go,我用的是 AN INTRODUCTION TO PROGRAMMING IN GO 链接, 很薄的小册子, 可以迅速了解go语言的基本语法。 6.824 Lab 1: MapReduce 实验要求, Part 1 需要完成一个完整Word Count程序中的map函数和reduce函数, 第一步当然是读提供的代码, 把mapreduce.go中RunSingle()流程读懂,知道map函数和redu...阅读全文

博文 2015-03-30 11:57 b4s1cv8vc

go语言怎样开多进程图文讲解。

今天给大家讲解下go语言开多进程。 package main import ( "fmt" "time" ) var c chan int func main() { c = make(chan int) go waiting("coffee", 1) go waiting("tea", 2) fmt.Println("I,am waiting") //time.Sleep(3 * time.Second) <-c <-c } func waiting(w string, sec int) { time.Sleep(time.Duration(sec) * time.Second) fmt.Println(w, "is ready") c <- 1 } 如果进程开的比较多,怎样去避免去写多个...阅读全文

博文 2015-03-20 12:10 guoer9973

golang判断短chan channel是否关闭

golang判断短chan channel是否关闭 群里有朋友问,怎么判断chan是否关闭,因为close的channel不会阻塞,并返回类型的nil值,会导致死循环.在这里写个例子记录一下,并且分享给大家 如果不判断chan是否关闭 Notice: 以下代码会产生死循环 package main import ( "fmt" ) func main() { c := make(chan int, 10) c <- 1 c <- 2 c <- 3 close(c) for { fmt.Println(<-c) } } 判断短chan是否关闭 package main import ( "fmt" ) func main() { c := make(chan int, 10) c <- 1 c...阅读全文

博文 2015-08-10 13:51 moxiaopeng

google hosts 2015

感谢互联网为所有人提供开放自由的服务,祝愿祖国繁荣富强人民安居乐业。 ------ 注1:请使用chrome浏览器,并在地址栏里输入chrome://flags/,然后查找QUIC,启用该协议,同时建议启用SPDY/4,能让访问更流畅。 注2:请使用https的方式访问,比如:https://www.google.com 注3:默认可能会跳转到www.google.com.hk,如果.hk访问困难,请使用:https://www.google.com/ncr 方式访问,禁止国别跳转。 ------ google hosts 2015.2.2 ========================================= #google-hosts-2015 #base services ...阅读全文

博文 2015-02-05 00:11 5tao

golang官方实现如何对httpserver做频率限制(最大连接数限制)

一般海量处理服务,都会对服务做个最大连接数限制,超过该限制之后,拒绝服务,避免发生雪崩,压坏服务。 使用golang来编写httpserver时,如何进行呢?官方已经有实现好的包。 使用示例: import("golang.org/x/net/netutil")l, err := net.Listen("tcp", "127.0.0.1:0") if err != nil { fmt.Fatalf("Listen: %v", err) } defer l.Close() l = LimitListener(l, max) http.Serve(l, http.HandlerFunc()) //bla bla bla................. 源码如下(url : https://gi...阅读全文

博文 2015-03-17 14:17 zhangqingping

进一步认识golang中的并发

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

博文 2014-04-28 22:24 gophers

golang 线程与通道

首先我们来看线程,在golang里面也叫goroutine 在读这篇文章之前,我们需要了解一下并发与并行。golang的线程是一种并发机制,而不是并行。它们之间的区别大家可以上网搜一下,网上有很多的介绍。 下面我们先来看一个例子吧 import( "fmt" ) funcmain(){ go fmt.Println("1") fmt.Println("2") } 在golang里面,使用go这个关键字,后面再跟上一个函数就可以创建一个线程。后面的这个函数可以是已经写好的函数,也可以是一个匿名函数 funcmain(){ vari=3 go func(a int) { fmt.Println(a) fmt.Println("1") }(i) fmt.Println("2") } 上面的代码就创...阅读全文

博文 2015-01-21 10:43 niechaoya

golang中timer定时器实现原理

一般我们导入import ("time")包,然后调用time.NewTicker(1 * time.Second) 实现一个定时器: func timer1() { timer1 := time.NewTicker(1 * time.Second) for { select { case <-timer1.C: xxx() //执行我们想要的操作 } } } 再看看timer包中NewTicker的具体实现: func NewTicker(d Duration) *Ticker { if d <= 0 { panic(errors.New("non-positive interval for NewTicker")) } // Give the channel a 1-element ti...阅读全文

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-04-20 20:31 abv123456789

如何优雅地等待所有的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...阅读全文

深入讨论channel timeout

Go 语言的 channel 本身是不支持 timeout 的,所以一般实现 channel 的读写超时都采用 select,如下: select { case <-c: case <-time.After(time.Second): } 这两天在写码的过程中突然对这样实现 channel 超时产生了怀疑,这种方式真的好吗?于是我写了这样一个测试程序: package main import ( "os" "time" ) func main() { c := make(chan int, 100) go func() { for i := 0; i < 10; i++ { c <- 1 time.Sleep(time.Second) } os.Exit(0) }() for { selec...阅读全文

Golang: 利用 channel (管道) 技术多线程下载图片

利用 channel (管道) 技术多线程下载图片. package main import ( "io/ioutil" "log" "net/http" "os" "regexp" //"strconv" "strings" "sync" ) var urlist = [...]string{"http://stock.591hx.com/article/2014-12-03/0000850005s.shtml"} var album chan string var w sync.WaitGroup var dir string func main() { dir = "tmp_chenjo/" err := os.Mkdir(dir, 0777) if err != nil { isex...阅读全文

博文 2015-01-18 kanglecjr

Emacs for Go

In this post I'm going to explore customizing Emacs to make hacking on Go a little more fluid. This is a living document and will probably be updated as I discover new modes and tools. The Emacs modes I currently use are: go-mode, oracle, goflymake, and gocode. I break out my Emacs configuration into language or package specific configuration files...阅读全文

博文 2014-11-29 18:54 TinkerS

golang rabbitmq实践 (二 实现简单的消息收发)

1:驱动 本来打算自己写一个驱动的,后来发现github上面已经有了,那我就直接拿现成的了, 驱动采用 github.com/streadway/amqp ,直接import就可以啦! 2:exchange and queue 在上一篇文章中,我们已经创建好virtualhost 、exchange and queue,所以我们先定义这些常量 const ( queueName = "push.msg.q" exchange = "t.msg.ex" mqurl ="amqp://shi:123@192.168.232.130:5672/test" ) var conn *amqp.Connectionvar channel *amqp.Channel 3:错误处理 func failOnE...阅读全文

博文 2015-09-11 10:04 shi-meng

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...阅读全文

博文 2014-10-04 14:08:31 华子

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 08:20 waylau

对golang服务器开发模式的一些思考

多线程+同步阻塞模型 在我们的游戏项目中使用的golang服务器开发方式如下 1.多线程逻辑 2.同步阻塞. 也就是说, 每个人一个线程(goroutine), io线程=逻辑线程 这种方式的优点: 1. 同步阻塞方式与人的思维方式类同 2. 逻辑处理性能有一定提升 在大规模使用这种模式编写逻辑后, 我们发现了这种模式只有1个缺点: 编写者需要处理多线程关系 但这本身确实直接致命的, 回想C++时代, 多线程处理时, 调试重现的困难… 脑补景象太惨不敢直视 单线程+异步多进程模型 在C++时代, 我曾经编写过一套asio的C++服务器框架. 采用io多线程, 逻辑单线程, 依赖着C++高性能的优势, 让开发便捷简单且无需关心线程问题. 那么到了golang时代, 为什么不能试下单线程异步多进...阅读全文

博文 2015-10-17 17:57 zangao