golang and design pattern

学习java的时候,“设计模式”这个概念到处可见。比如java.io里面的 decorated pattern,Object.Clone(Object)原生态支持Prototype pattern,Swing事件响应的Observer pattern, io.util和Event中的Adapter pattern。还有第三方框架中形形色色的design pattern。有时候从代码中突然发现一个design pattern,喜不自禁。 现在学习go语言,就再也没有从go语言中听到design p...阅读全文

2015-04-08 01:30 harrysun
阅读:4412 评论:0

Struct composition with Go

This is a quick Friday blog post to talk about a recent experience I had working on a piece Juju code that needed to capture the data being sent over a net.Conn. Most Gophers know that the net package provides a net.Pipe function which returns a pair...阅读全文

May 22, 2015 Dave Cheney
阅读:2335 评论:0

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

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

2014-12-21 10:35 yongjian_lian
阅读:20715 评论:0

理解Go 1.5 vendor

理解Go 1.5 vendor 七 31 bigwhite技术志 gb, Go, go1.4, Go1.5, GO15VENDOREXPERIMENT, godep, Golang, golang-dev, Google, GOPATH, GOROOT, internal, Package, RussCox, vendor No Comments Go 1.5中(目前最新版本go1.5beta3)加入了一个experimental feature: vendor/。这个feature不是Go 1...阅读全文

阅读:17609 评论:2

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

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

2015-10-13 16:30 xiaohu50
阅读:18781 评论:0

go 格言

转自: http://go-proverbs.github.io/ Simple, Poetic, Pithy Don't communicate by sharing memory, share memory by communicating. Concurrency is not parallelism. Channels orchestrate; mutexes serialize. The bigger the interface, the weaker the abstraction....阅读全文

2015-11-27 14:47 leonzhouwei
阅读:2117 评论:0

GO-回调函数

1,什么是回调函数。一个函数中有个参数为函数的指针。该函数自己调用自己指针函数即可; 2,为什么要使用回调函数。抽象画了一个函数,简洁代码。异步执行 3,例子: // HuiDiaoFunc project main.go package main import ( "fmt" ) //函数 里面有个两个参数的回调函数 func print(call func(a int, b int) int) { fmt.Print(call(2, 1)) } func main() { //调用函数,回调...阅读全文

阅读:6720 评论:0

如何裸写一个goroutine pool

引言在上文中,我说到golang的原生http server处理client的connection的时候,每个connection起一个goroutine,这是一个相当粗暴的方法。为了感受更深一点,我们来看一下go的源码。先定义一个最简单的http server如下。12345678func myHandler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello there!\n")}func main(){ http....阅读全文

阅读:1250 评论:0

fasthttp的goroutine pool实现探究

引言fasthttp是一个非常优秀的web server框架,号称比官方的net/http快10倍以上。fasthttp用了很多黑魔法。俗话说,源码面前,了无秘密,我们今天通过源码来看一看她的goroutine pool的实现。 热身fasthttp写server和原生的net/http写法上基本没有区别,这里就不举例子。直接找到入口函数,在根目录下的server.go文件中,我们从函数ListenAndServe()跟踪进去。从端口监听到处理请求的函数调用链如下。123456789101112...阅读全文

阅读:1031 评论:0

Go语言并发的设计模式和应用场景

生成器 在Python中我们可以使用yield关键字来让一个函数成为生成器,在Go中我们可以使用信道来制造生成器(一种lazy load类似的东西)。 当然我们的信道并不是简单的做阻塞主线的功能来使用的哦。 下面是一个制作自增整数生成器的例子,直到主线向信道索要数据,我们才添加数据到信道: func xrange() chan int{ // xrange用来生成自增的整数 var ch chan int = make(chan int) go func() { // 开出一个goroutine...阅读全文

阅读:4452 评论:0

html5+go+websocket简单实例代码

这次的就直接发放代码截图吧,应该是用go语言做后台一个简易的聊天,这里没用到什么特别的知识,最朴实的来实现效果,主要目的是分享下h5怎么用websocket,go搭建websocket服务的主要部分。 go代码部分: 1 // WebChat project main.go 2 package main 3 4 import ( 5 "fmt" 6 "net/http" 7 "time" 8 9 "encoding/json" 10 11 "strings" 12 13 "golang.org/...阅读全文

2016-05-27 18:34 wangrudong003
阅读:2788 评论:0

golang积累-Call回调模式

一般提到回调,第一反映就是函数回调,太熟悉了。在学习golang的过程中,通过阅读相关源代码,发现golang结合channel和WaitGroup,会有非常特殊的有别于函数回调的结果返回方式,常用于相对耗时运算的结果获取。其核心思路就是利用延时信号通知,来返回。因为暂时没查到中文的定义,暂时叫做Call回调,或者叫完成通知模式。 通道组合 Call就是一个公共的可访问的结构体定义,用于包装用户请求与结果,然后通过内部额外加入的channel封装实现异步结果的返回。对使用者而言,需要知道Call...阅读全文

2016-07-07 12:56 qq_26981997
阅读:11142 评论:2

go中方法的接收者是值或者指针的区别

值类型的变量和指针类型的变量先声明一个结构体:type T struct { Name string } func (t T) M1() { t.Name = "name1" } func (t *T) M2() { t.Name = "name2" }12345678910111234567891011M1() 的接收者是值类型 T, M2() 的接收者是值类型 *T , 两个方法内都是改变Name值。下面声明一个 T 类型的变量,并调用 M1() 和 M2() 。 t1 := T{"t1"}...阅读全文

阅读:9255 评论:0

用 Go 实现图片尺寸的自动调节

我刚上大学那会儿,课上到最后几分钟的时候,我会翘课奔到另外一个我几乎不怎么了解的班上去蹭课。碰巧,那个班上的课是我觉得最棒的课之一 ——计算机视觉。此外,那个课上介绍了一种很赞的算法:Seam Carving,精雕细琢。 这个算法大概是酱紫的:一般我们想改变图片大小的时候,会采用裁剪和缩放的方式,这样一来,图片会损失很多重要信息,在处理过程中,图片甚至被歪曲。那么,我们怎么才能找到图片中视觉信息最少的部分,要调整图片大小的时候,只把这部分移除掉是不是可以呢? 上图展示给我们一副很美的画面:开阔的...阅读全文

2016-08-04 19:00:00 hxapp2, coraall 等
阅读:3260 评论:0

golang 进程出现too many open files的排查过程

1. 现象 服务的cpu跑满(golang实现), 并大量报too many open files错误.服务使用systemd来运行,部署在阿里ecs上. 2.分析 从日志来看,cpu的上升主要为到达文件数限制引起的,但之前已经更改过系统的文件数及所有用户的文件数,按道理是不应该出现这个问题的,后来查阅资料发现,文件数可以从三个维度限制分别为操作系统限制,用户态限制,以及进程限制,对于这三个维度选取最小值生效.于是对系统进行分析. 首先查看当前打开文件数, 进程占用的文件数并不多. lsof -...阅读全文

阅读:4854 评论:1

Go语言实战笔记(十六)| Go 并发示例-Pool

《Go语言实战》读书笔记,未完待续,欢迎扫码关注公众号flysnow_org或者网站http://www.flysnow.org/,第一时间看后续笔记。觉得有帮助的话,顺手分享到朋友圈吧,感谢支持。 这篇文章演示使用有缓冲的通道实现一个资源池,这个资源池可以管理在任意多个goroutine之间共享的资源,比如网络连接、数据库连接等,我们在数据库操作的时候,比较常见的就是数据连接池,也可以基于我们实现的资源池来实现。 可以看出,资源池也是一种非常流畅性的模式,这种模式一般适用于在多个gorouti...阅读全文

May 1, 2017 飞雪无情
阅读:737 评论:0

Golang 通用连接池库 Golang-Pool

Golang 实现的连接池功能:* 连接池中连接类型为interface{},使得更加通用* 链接的最大空闲时间,超时的链接将关闭丢弃,可避免空闲时链接自动失效问题* 使用channel处理池中的链接,高效基本用法//factory 创建连接的方法 factory := func() (interface{}, error) { return net.Dial("tcp", "127.0.0.1:4000") } //close 关闭链接的方法 close := func(v interface...阅读全文

2017-08-30 14:07 zhangboyu
阅读:3694 评论:0

在 Golang 中针对 int64 类型优化 abs()

Go 语言没有内置 `abs()` 标准函数来计算整数的绝对值,这里的绝对值是指负数、正数的非负表示。 我最近为了解决 [Advent of Code 2017](http://adventofcode.com/2017/about) 上边的 [Day 20](http://adventofcode.com/2017/day/20) 难题,自己实现了一个 `abs()` 函数。如果你想学点新东西或试试身手,可以去一探究竟。 Go 实际上已经在 `math` 包中实现了 `abs()`...阅读全文

2018-02-08 10:22:20 wuYinBest
阅读:2912 评论:1