使用Go语言两三事
使用Go语言两三事,在网上看到的总结的很不错哦,转自http://www.cnblogs.com/sevenyuan/archive/2013/02/27/2935887.html
一、channel的使用
在Go里,写多线程程序变的更简单了,比如,我们要自己手写实现个简单的数据库连接池,在Java里,我们需要一个数组来存放数据库连接,连接池的所有操作方法都要对其加上锁,以确保两个线程没有共用一个连接,连接池里没连接了或连接满了怎么办等。然而在Go里,我们只需要一个具有缓冲区的channel就行了:
pool := make(chan mysql.Conn, size)
conn := <-p.pool //从连接池取一个连接
p.pool <- conn //在把连接放回连接池
就这三句简单的代码组成了实现一个完美支持多线程的数据库连接池类库的核心基石,剩下的就是对该类库功能上的完美封装与优化了。
二、map的使用
Go语言的map,是将map这种复杂的数据结构做为语言的内置类型来实现的。
oneMap[key] = value //直接赋值
value,ok := oneMap[key] //取一个map的值与判断该key是否存在一体化完成
for key,value := range oneMap {} //简单遍历一个map,取得key与其value
delete(oneMap[key]) //删除一个key,不用担心该key不存在于map中而报错
单单以上四项,就不知给我的开发带来了多少的方便,而且增强了程序的健壮性。
三、json的使用
由于项目中很多地方需要用到使用json文件做为程序的配置文件,因此,解析json数据也是经常做的事,Go语言提供给我们的json库能让我们很方便的解析自己想要的json数据,只要定义一个与json文件结构一样的struct或map就可以了。
json.Unmarshal(jsonbytes, jsonObj) //jsonObj的结构要与数据本身格式一样
而且,json库还提供了MarshalJSON接口方法,外部程序只要实现了该接口,就可以自定义生成json数据的方式了。
四、格式化生成字符串
在Go里,使用了fmt.Sprintf()方法,在方法里传入自己预先定义好的模版,然后按顺序传入自己想往模版里填的数据,就生成自己想要的格式化字符串了。这点尤其适用于我们生成具有固定格式的日志数据,比如:
fmt.Sprintf("[%s] %s %s",time,ip,log)
就能格式化一条形式如:[2012-12-20] 127.0.0.1 LOG_CONTENT 的日志,很方便有木有。
五、自定义类型的使用
有一次自己想实现一套类似这样的机制,就是所有方法名放在一个配置文件里,然后在运行时可以根据命令行指定方法名执行相应的实现方法,按以前的思路,是要实现一套工厂模式的代码,但在Go里,一个map就搞定了:

type CreatorImpl func() ICreater
var funcmap = map[string]CreatorImpl{"Method1": Method1Impl,
"Method2": Method2Impl}
funcmap[builder]() //builder为外部传入的参数,执行指定的方法
func Method1Impl() ICreater {
//实现1
}
func Method2Impl() ICreater {
//实现2
}

将方法的声明定义为一个类型CreatorImpl,将CreatorImpl做为一个map的值类型生成一个map,实现一个类似工厂模式功能的代码就这么简单。
六、反射的使用
反射是把双刃剑,在Go中,使用反射倒也没有觉得比其他语言有更优秀,但对于特定应用场景,适当的使用反射,能让我们的程序更优雅和简洁,附上一段我在项目中统一判断具有不同类型和结构的对象里的属性是否包含空串的代码:

logvalue := reflect.ValueOf(log).Elem()
islegal := true
for i := 1; i < logvalue.NumField(); i++ {
f := logvalue.Field(i)
str := fmt.Sprintf("%v", f.Interface())
islegal = (str != "")
if !islegal {
return islegal
}
}

七、严格的编译
Go代码的编译器能让你在编译的时候就修正一切可能带来错误和垃圾代码的代码,比如引入的包、声明的变量在程序中没有使用到,会编译错误;不小心调用了错误的方法等等。剩下的错误就是代码本身逻辑的错误了,这些都给日常开发带来了非常大的方便。
八、其他
还有优雅而明确的变量声明方式,方便的单元测试go test,容易处理的error,时刻保证资源释放的defer语句,报错panic函数,恢复recover函数。对了,结合panic和recover方法,再依靠Go本身的系统库,可以实现一个类似Java中的异常栈信息,输出从引发panic到执行recover过程中所经历的所有方法调用与所在行号。这点在错误日志记录中尤为有用。
很喜欢使用Go开发项目,我相信Go语言会越来越被世人所接受和熟知,并加以应用,发展的越来越好!
使用Go语言两三事的更多相关文章
- go学习资料及优秀博文
相关书籍: Go Web编程 http://blog.csdn.net/broadview2006/article/details/8875097 优秀博文: 系统编程语言明日之星—Go(http:/ ...
- C语言 · 高精度加法
问题描述 输入两个整数a和b,输出这两个整数的和.a和b都不超过100位. 算法描述 由于a和b都比较大,所以不能直接使用语言中的标准数据类型来存储.对于这种问题,一般使用数组来处理. 定义一个数组A ...
- Windows server 2012 添加中文语言包(英文转为中文)(离线)
Windows server 2012 添加中文语言包(英文转为中文)(离线) 相关资料: 公司环境:亚马孙aws虚拟机 英文版Windows2012 中文SQL Server2012安装包,需要安装 ...
- iOS开发系列--Swift语言
概述 Swift是苹果2014年推出的全新的编程语言,它继承了C语言.ObjC的特性,且克服了C语言的兼容性问题.Swift发展过程中不仅保留了ObjC很多语法特性,它也借鉴了多种现代化语言的特点,在 ...
- C语言 · Anagrams问题
问题描述 Anagrams指的是具有如下特性的两个单词:在这两个单词当中,每一个英文字母(不区分大小写)所出现的次数都是相同的.例如,"Unclear"和"Nuclear ...
- C语言 · 字符转对比
问题描述 给定两个仅由大写字母或小写字母组成的字符串(长度介于1到10之间),它们之间的关系是以下4中情况之一: 1:两个字符串长度不等.比如 Beijing 和 Hebei 2:两个字符串不仅长度相 ...
- JAVA语言中的修饰符
JAVA语言中的修饰符 -----------------------------------------------01--------------------------------------- ...
- Atitit 项目语言的选择 java c#.net php??
Atitit 项目语言的选择 java c#.net php?? 1.1. 编程语言与技术,应该使用开放式的目前流行的语言趋势1 1.2. 从个人职业生涯考虑,java优先1 1.3. 从项目实际来 ...
- 【开源】简单4步搞定QQ登录,无需什么代码功底【无语言界限】
说17号发超简单的教程就17号,qq核审通过后就封装了这个,现在放出来~~ 这个是我封装的一个开源项目:https://github.com/dunitian/LoTQQLogin ————————— ...
随机推荐
- tlplayer 所有平台版本支持水印叠加
tlplayer支持视频渲染前水印叠加,各个系统版本同样支持. 联系方式:weinyzhou86@gmail.com QQ:514540005 版权所有,禁止转载. 发布自:http://blog.c ...
- js生成二维码参数设置
jquery qrcode使用方法 $(selector).qrcode({ width: 100, height: 100, color: '#3a3', text: 'http://larsjun ...
- linux中fork()函数详解(转)
转自:http://blog.csdn.net/jason314/article/details/5640969 一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过 ...
- 史上最全面的FRM与CFA的区别对比分析,适合新人看
简单地自我介绍:本人于纽约完成了研究生阶段的学习后,在华尔街混迹了几年的时间,已获取FRM证书,正在积极准备CFA. 上海财经大学FRM培训中心前言导读 经常看到CFA持证人平均年收入为$XXX之类的 ...
- bzoj2324后续思考
昨天写bzoj2324的解题报告的时候突然隐隐约约发现了我程序的一点问题 睡了一觉之后找到了反例 如下: 4 4 2 0 1 2 1 2 1 2 3 2 2 4 2 对于这个测试数据,显然最短路径和为 ...
- SCOI2007蜥蜴
Description 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱 上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,即蜥蜴可以跳到 ...
- (七)学习CSS之filter属性
filter: alpha(opacity=,finishopacity=,style=)??? alpha是来设置透明度的,它的基本属性是filter:alpha(opacity,finishopa ...
- LA 6540 Fibonacci Tree
以前做过的题···重新做一遍之后怎么做怎么wa···后来GG了···第二天看不知道为啥A了···难道我失忆了? 题意:无向图,边有黑色和白色两种颜色,求是否存在一个生成树中白边的个数是斐波那契数. 解 ...
- HDU 5007 Post Robot
Post Robot Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
- 《深入Java虚拟机学习笔记》- 第19章 方法的调用与返回
<深入Java虚拟机学习笔记>- 第19章 方法的调用与返回