golang实现web中间件的一些思考

最近陆续看了golang的Martini框架,也试用了,这个山寨自node.js的Express框架和最新的koa框架的golang框架, 同样具有低耦合的特点,不过还是担忧其性能,因为核心采用了reflect反射技术。     golang的http包用Hander、handerfuc这些来解决中间件的问题,比如说验证,日志等,采取的是一层层封装的方式, 好比洋葱。这样写出来的代码的缺点是耦合度高。如果中间件的顺序或者名字变换,则有很多代码需要改动。      为了降低依赖,则需让代码...阅读全文

开源中国博客 2014-04-15 09:12 yzq1979

在golang中使用leveldb

leveldb是一个很强悍的kv数据库,自然,我也希望能在go中使用。 如果有官方的go leveldb实现,那我会优先考虑,譬如这个,但是该库文档完全没有,并且在网上没发现有人用于实战环境,对其能否在生产环境中使用打上问号,保险起见,我还是决定不使用。 因为leveldb有c的接口,所以通过cgo能很方便的进行集成,所以我决定采用该种方式,幸运的是,已经有人做了cgo的版本,也就是levigo。 使用levigo,需要编译安装leveldb,如果需要压缩支持还需要编译snappy,...阅读全文

开源中国博客 2014-05-11 16:30 siddontang

golang revel 学习 - 项目结构

revel是典型的mvc框架,使用命令revel new [appname]创建revel工程后,默认结构为: app     | controllers - mvc模式的控制器,接收客户端request完成逻辑处理并返回渲染的结果-html,json,xml...     | routes - revel自动生成的路由代码,将conf/routes中配置的url和controller的映射关系写入代码中,实现静态化,我想这样可以在build后提高性能,比完全动态映射效率要高,...阅读全文

开源中国博客 2013-08-22 12:58 dijin

golang socket服务器

一、main.go该代码从项目中分离出来,自行修改后再运行) package main import ( "flag" "fmt" "log" "os" "runtime" ) var ( Port           = flag.String("i", ":12345", "IP port to listen on") logFileName    = flag.String("log", "cServer.log", "Log file name") configFi...阅读全文

开源中国博客 2014-03-19 12:07 liaojie

golang sync.Pool试用说明及注意事项

Go tip 是 Go 语言的实验分支,包含了很多尚在讨论,但很有可能会加入 stable 分支的特性。“Go tip 在做什么”(原文地址:What's happening in Go tip)分析总结了 Go 语言尚在开发中的一些重要特性。 本文译自:What's happening in Go tip (2014-01-10) 现在是 2014 年了,刚刚经历了圣诞和新年前夜,Go 团队就已经开始为下一个发布版本而工作了。也因此,“Go tip 在做什么”系列也重开了。 作为这个...阅读全文

开源中国博客 2014-06-20 14:29 wkh

golang内置类型和函数

/* 内置类型 值类型: bool int(32 or 64), int8, int16, int32, int64 uint(32 or 64), uint8(byte), uint16, uint32, uint64 float32, float64 string complex64, complex128 array    -- 固定长度的数组 引用类型:(指针类型) slice   -- 序列数组(最常用) map        -- 映射 chan    -- 管道 内置函数 ap...阅读全文

开源中国博客 2013-07-02 15:09 Robin3D

golang 定时器

// (A) time.AfterFunc(5 * time.Minute, func() {     fmt.Printf("expired") } // (B) create a Timer object timer := time.NewTimer(5 * time.Minute) <-timer.C fmt.Printf("expired") // (C) time.After() returns timer.C internally <-time.After(5 * time.Mi...阅读全文

开源中国博客 2013-12-29 12:30 咖啡伴侣

golang 内建函数

close new panic complexdelete make recover real len append print imag cap copy println close 用于channel 通讯。使用它来关闭channel delete 用于在map 中删除实例。 len 和cap 可用于不同的类型, len 用于返回字符串、slice 和数组的长度. new 用于各种类型的内存分配。 make 用于内建类型(map、slice 和channel)的内存分...阅读全文

开源中国博客 2014-06-21 23:52 lyle27

golang: Martini之inject源码分析

依赖注入(Dependency Injection)和控制反转(Inversion of Control)是同一个概念。在传统的程序设计过程中,调用者是自己来决定使用哪些被调用者实现的。但是在依赖注入模式中,创建被调用者的工作不再由调用者来完成,因此称为控制反转;创建被调用者实例的工作通常由注入器来完成,然后注入调用者,因此也称为依赖注入。 inject 是依赖注入的golang实现,作者是 codegangsta 。它能在运行时注入参数,调用方法。是Martini框架的基础核心。 我对依赖...阅读全文

开源中国博客 2014-01-22 15:23 陈一回

golang channel 有缓冲 与 无缓冲 的重要区别

golang channel 有缓冲 与 无缓冲 是有重要区别的 我之前天真的认为 有缓冲与无缓冲的区别 只是 无缓冲的 是 默认 缓冲 为1 的缓冲式 其实是彻底错误的,无缓冲的与有缓冲channel有着重大差别 那就是一个是同步的 一个是非同步的 怎么说?比如 c1:=make(chan int)        无缓冲 c2:=make(chan int,1)      有缓冲 c1<-1                             ...阅读全文

开源中国博客 2013-08-01 17:25 健哥大人

让golang在Raspberry Pi上飞一会

最近在玩2样东西,一样是go语言(golang),一样是Raspberry Pi(树莓派)。那么能在Raspberry上运行go语言程序吗? Golang的文档上说是支持多平台的,其中也包括了ARM,看来有戏了,兴冲冲打开http://code.google.com/p/go/downloads/list (golang编译器的下载页面) ,却发现没有arm平台的二进制大包下载。所以arm平台下的需要下载源码自己编译。   Raspberry上编译前准备及配置...阅读全文

开源中国博客 2014-01-09 00:32 quanpower

我第1个可用的golang小程序

为什么要写这个程序 寻找时间同步Api 编写同步程序 封装成windows service   为什么要写这个程序        一直在关注golang, 从2011年4月配置环境写了个hello world!(http://weibo.com/1409046677/wr4n3vdYFV), 后来没再动手写golang代码了, 只是关注golang方面的信息/资讯。去年到今年稍认真的看了一些golang的基础语法,然后前几天家里的台式电脑又开机用了一下,可能是bios电...阅读全文

开源中国博客 2014-04-24 13:28 老匡

golang多核陷阱一例

同时发布在独立博客。 以前一直以为,在Golang中,针对高并发的情况,采用多核处理一定效果最优,但是项目实践证明事实不是这样的。 在Sniper项目中(一个结合了ab和siege优点的http负载测试工具),原来一直设置cup使用数为系统cpu总数: runtime.GOMAXPROCS(runtime.NumCPU()) 在与ab的性能比较中一直有较大差距,GET请求局域网的一个10k大小的文件: 以下是ab的性能,并发100,总请求100k,执行时间...阅读全文

开源中国博客 2013-11-10 22:42 lubia

golang 反射

package main import ( "fmt" "reflect" ) type Person struct{} func (p *Person) Run() { fmt.Println("person running") } func doit(object interface{}, method interface{}) { v := reflect.ValueOf(object) f := reflect.ValueOf(method) f.Call([]ref...阅读全文

开源中国博客 2013-06-30 00:39 Mocos

golang 基础

1.//对map中的struct赋值 type person struct { id int name string } func main() { persons := make(map[int]person) persons[0] = person{1, "a"} log.Println(persons[0]) v, ok := persons[0] if ok { v.id = 0 persons[0] = v } log.Println(p...阅读全文

开源中国博客 2013-07-25 16:09 陈好