golang web sample
一、学习想法 用两天的时间学习golang,但这次是先不看书的,直接写代码先。 我们常习惯边看书边学习写代码,但发现过程是比较缓慢的,所以我就先想写代码, 边写边查。就我们所知,web app一般是基于MVC框架,那么我可以先写数据层,从先写 数据库查数据开始,可以用DAO模式,但这里我只是用一个简单的sample,没有那么复杂。 接着写完数据层,再写视图层,视图层即为app逻辑层;之后再写http前端渲染层。 一步一步,遇到不懂就查。 二、学习资源 Golang电子书 An...阅读全文
用wrk测试nginx/ndoejs/golang
sudo taskset -c 1 ./wrk -c1 -t1 -d30 http://localhost/hello wrk+nginx(helloworld module) sudo taskset -c 0 sbin/nginx nginx: cpu:76% wrk: cpu:70% Running 30s test @ http://localhost/hello 1 threads and 1 connections Threa...阅读全文
golang系统性能监控初探
系统服务(这里不局限于golang写的后台服务,也包括c++,java等后台语言)需要考虑的两个问题 1. 系统的资源使用情况(cpu利用率,内存分配情况等,runtime和syscall都提供了支持,这个是系统内部性质,往往是设计系统资源问题,需要在设计的时候慎重考虑) 2. 系统的服务情况(就是服务时延,这个是client可以直接感知的,往往是client最关注的,决定了服务的qps) 提前评估系统的资源消耗是很重要的,在公司里面,能提供选择的机器类型是很多种的。比如腾讯,往往动则...阅读全文
ubuntu下使用golang、qml与ubuntu sdk开发桌面应用 (简单示例)
找了很长时间go的gui库,试了gtk,准备试qt的时候发现了这个qml库,试了下很好用。 ##准备工作 **1、Go 1.2RC1** go的版本应该不能低于这个,我是在1.2RC发布当天升级后发现的qml,并测试的。 **2、qml** 项目主页 https://github.com/niemeyer/qml 目前还是alpha版。 项目主页里面有各个平台的安装方法 装好后会顺带把qtcreator的ubuntu sdk plugin也给装上。 然后运行qml的示例程序 g...阅读全文
golang的闭包和普通函数调用区别
先看一段程序 package main import ( "fmt") func main() { a := []int{1, 2, 3} for _, i := range a { fmt.Println(i) defer p(i) } } func p(i int) { fmt.Println(i) } 运行这段程序,输出结果为 1 2 3 3 2 1 这里就是普通的函数调用,每次调用func p时,完成 i 的值复制,然后打印,此时 i 值复制了3...阅读全文
golang:高性能消息队列moonmq的简单使用
在上一篇moonmq的介绍中(这里),我只简短的罗列了一些moonmq的设计想法,可是对于怎样使用并没有具体说明,公司同事无法非常好的使用。 对于moonmq的使用,事实上非常easy,例子代码在这里,我们仅仅须要处理好broker,consumer以及publisher的关系就能够了。 首先,我们须要启动一个broker,由于moonmq如今仅仅支持tcp的自己定义协议,所以broker启动的时候须要指定一个listen address。 #启动broker ./simple_broker...阅读全文
golang web编程:简单的会话(使用sessions包)
网站不能根据来访的ip来确定来访者的身份,ip加端口号也不行.一般都是通过用户名密码来确定用户身份的,但用户也不能每次访问网页时都手动输入一次用户名和密码啊,这样太累了. 一个最简单的想法就是让浏览器帮我们输入,但是http协议本身没有夹带用户名密码的功能,而且有时我们的需求又不只是用户名和密码这么简单,比如说我们还想在浏览器和网页服务器之间传递用户的id,上次访问网站的时间等,每个网站的要求都不一样,所谓众口难调. 现在的做法是,浏览器允许网页服务器在浏览器里存一小段数据,什么数据都行,你自己...阅读全文
golang使用pprof检查goroutine泄露
有一段时间,我们的推送服务socket占用非常不正常,我们自己统计的同一时候在线就10w的用户,可是占用的socket居然达到30w,然后查看goroutine的数量,发现已经60w+。 每一个用户占用一个socket,而一个socket,有read和write两个goroutine,简化的代码例如以下: c, _ := listerner.Accept() go c.run() func (c *conn) run() { go c.onWrite() c.onRead(...阅读全文
go package学习——os/exec
package exec用于运行外部命令,它封装了os.StartProcess,从而使操作更容易。 Index Variables func LookPath(file string) (string, error) type Cmd func Command(name string, arg ...string) *Cmd func (c *Cmd) CombinedOutput() ([]byte, error) ...阅读全文
golang 数据建模json解析
1.0 controller get请求 type MainController struct { beego.Controller } func (this *MainController) Get() { this.Data["IsHome"] = true this.Data["Website"] = "s.me" this.Data["Email"] = "304030196@qq.com" this.TplNames = "templets...阅读全文
golang实现udp接入服务器
前端通过udp与接入服务器连接,接入服务器与后端tcp服务器维持tcp连接。目录结构及后端tcp服务器代码同上一篇博客。 main.go package main import ( "lotuslib" ) const ( ip = "0.0.0.0" port = 1987 ) func main() { udplotus.UdpLotusMain(ip, port) } udplotus.go package udplotus import ...阅读全文
golang实现tcp接入服务器
接入服务器和后端业务服务其维持tcp连接,多个前端请求通过接入服务器访问后端业务服务器,接入服务器可以方便增加路由功能,维护多个业务服务器,根据消息ID路由到具体的业务服务器。 项目目录如下 simplelotus src lotus main.go lotuslib tcplotus.go test tcpclient.go tcpserver.go install install源码如下: #!/usr/...阅读全文
我为什么选择go语言
这里,我并不打算引起语言争论的口水仗,我并不是什么大牛,对语言的造诣也不深,只是想通过自己实际的经历,来说说为什么我在项目中选择go。 其他语言的经历 C++ 在接触go之前,我已经有多年的c++开发经验。主要用在游戏服务端引擎开发以及P2P上面,那可是一段痛并快乐的时期,以至于我看到任何的程序钉子问题都觉得可以用c++这把锤子给敲定。但是对于互联网项目开发来说,除非你的团队整体的c++技术水平nb,并且有很强的代码规范,不然真可能是一场灾难,更别说我们现有团队几乎没其他人会这玩意了。 ...阅读全文
golang的指针到string,string到指针的转换
由于某个需求,需要如题的转换,废话不多说,直接贴代码了,其实挺丑了,备用了 func (this *Server) socketParserHandler(client *genTcpServer.Client, fullData []byte) { fmt.Println("original data is", client) strPointerHex := fmt.Sprintf("%p", unsafe.Pointer(client)) fmt.Println...阅读全文
golang 应用的部署相关技术
nohup命令 在 linux 下面部署,我们可以利用 nohup 命令,把应用部署在后端,如下所示: nohup ./yourapp & 这样你的应用就跑在了 Linux 系统的守护进程 nohup命令:如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令。该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。nohup就是不挂起的意思( no hang up)。 一般如何如下两种方式使用它: nohup command 或者 ...阅读全文
golang 处理Json 数组
今天遇到个接口需要处理一个json的map类型的数组,开始想法是用simple—json里的Array读取数组,然后遍历数组取出每个map,然后读取对应的值,在进行后续操作,貌似很简单的工作,却遇到了一个陷阱。 Json格式类似下边: {"code":0 ,"request_id": xxxx ,"code_msg":"" ,"body":[{ "device_id": "xxxx" ,"device_hid": "xxxx" }] , "count":0} ...阅读全文
golang 聊天室
最近看了一些关于golang的资料,发现它的WEBSOCKT实现真起来真的很容易,下面是代码 go.net/websocket是需要安装的,这个自己装上就行 package main import ( "container/list" "fmt" "go.net/websocket" "io" "net/http" ) var connid int var conns *list.List func Chat(ws *websocket.Conn)...阅读全文
[翻译] effective go 之 Initialization
Initialization Although it doesn't look superficially very different from initialization in C or C++, initialization in Go is more powerful. Complex structures can be built during initialization and the ordering issues between initialized objects ...阅读全文
golang 中的 类型判断
golang 中的 类型判断 类似于javascript中typeof 和 java中 instanceof 比如 var a interface{} newA,ok:=a.(string) 如果ok 是 true 则说明 变量a 是字符串类型,而newA就是string类型的变量,a的实际值 a.(type) 返回的是 a的 类型, 注意他返回的不是一个 字符串表示 string int 这样表示a的类型 a.(type)是和switch 搭配使用的 switch vtype:=v.(type...阅读全文