使用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语言两三事的更多相关文章

  1. go学习资料及优秀博文

    相关书籍: Go Web编程 http://blog.csdn.net/broadview2006/article/details/8875097 优秀博文: 系统编程语言明日之星—Go(http:/ ...

  2. C语言 · 高精度加法

    问题描述 输入两个整数a和b,输出这两个整数的和.a和b都不超过100位. 算法描述 由于a和b都比较大,所以不能直接使用语言中的标准数据类型来存储.对于这种问题,一般使用数组来处理. 定义一个数组A ...

  3. Windows server 2012 添加中文语言包(英文转为中文)(离线)

    Windows server 2012 添加中文语言包(英文转为中文)(离线) 相关资料: 公司环境:亚马孙aws虚拟机 英文版Windows2012 中文SQL Server2012安装包,需要安装 ...

  4. iOS开发系列--Swift语言

    概述 Swift是苹果2014年推出的全新的编程语言,它继承了C语言.ObjC的特性,且克服了C语言的兼容性问题.Swift发展过程中不仅保留了ObjC很多语法特性,它也借鉴了多种现代化语言的特点,在 ...

  5. C语言 · Anagrams问题

    问题描述 Anagrams指的是具有如下特性的两个单词:在这两个单词当中,每一个英文字母(不区分大小写)所出现的次数都是相同的.例如,"Unclear"和"Nuclear ...

  6. C语言 · 字符转对比

    问题描述 给定两个仅由大写字母或小写字母组成的字符串(长度介于1到10之间),它们之间的关系是以下4中情况之一: 1:两个字符串长度不等.比如 Beijing 和 Hebei 2:两个字符串不仅长度相 ...

  7. JAVA语言中的修饰符

    JAVA语言中的修饰符 -----------------------------------------------01--------------------------------------- ...

  8. Atitit 项目语言的选择 java c#.net  php??

    Atitit 项目语言的选择 java c#.net  php?? 1.1. 编程语言与技术,应该使用开放式的目前流行的语言趋势1 1.2. 从个人职业生涯考虑,java优先1 1.3. 从项目实际来 ...

  9. 【开源】简单4步搞定QQ登录,无需什么代码功底【无语言界限】

    说17号发超简单的教程就17号,qq核审通过后就封装了这个,现在放出来~~ 这个是我封装的一个开源项目:https://github.com/dunitian/LoTQQLogin ————————— ...

随机推荐

  1. 【HDOJ】4297 One and One Story

    综合性很强的题目.存在环,可以用tarjan处理,然后需要求LCA.并查集+RMQ可以搞.非常不错的题目. /* 4297 */ #include <iostream> #include ...

  2. poj 2442 Sequence(优先队列)

    题目:http://poj.org/problem?id=2442 题意:给你n*m的矩阵,然后每行取一个元素,组成一个包含n个元素的序列,一共有n^m种序列, 让你求出序列和最小的前n个序列的序列和 ...

  3. 利用icepdf将pdf文件转为图片

    所需jar 包为icepdf-core.jar.icepdf-extra.jar.icepdf-pro-intl.jar.icepdf-pro.jar和icepdf-viewer.jar. 示例代码如 ...

  4. HDU 5285 wyh2000 and pupil

    题意:有一群人,已知某两人之间互相不认识,要把这群人分成两部分,每部分至少一人,且在每部分内没有人互不认识. 解法:图染色.某场bestcoder第二题……看完题觉得是个二分图……完全不会二分图什么的 ...

  5. 别做操之过急的”无效将军”,做实实在在的”日拱一卒” zz

    别做操之过急的”无效将军”,做实实在在的”日拱一卒” 前天在网上看到一句话很不错,拿来和大家分享,同时用我的“大叔”三观来解读这句话. 这句话是:“我们不需要操之过急的”无效将军”,我们需要实实在在的 ...

  6. 为枚举类型添加说明 zt

    enum Orientation { [DescriptionAttribute("东")] East, [DescriptionAttribute("南")] ...

  7. [Andrew]Ext.net前台弹框

    //有询问的提示框 Ext.Msg.show({            title: title,            msg: msg,            buttons: Ext.Msg.Y ...

  8. Jquery+asp.net后台数据传到前台js进行解析的方法

    所以在解析后台数据的时候,我们需要根据后台的数据情况,特殊处理和对待. 我这里后台用的是asp.net提供的wcf服务,也有ashx一般处理程序.大致原理差不多. C#中我们经常用的对象,有实体对象比 ...

  9. Flash 导出图片和声音

    命令文件 PolarBear_jsfl.zip Flash Professional 编辑器命令,用来导出 flash 库中的图片和声音 使用步骤: 1. 首先下载 PolarBear_jsfl.zi ...

  10. 【译】 AWK教程指南 3计算并打印文件中指定的字段数据

    awk 处理数据时,它会自动从数据文件中一次读取一条记录,并会将该记录切分成一个个的字段:程序中可使用 $1, $2,... 直接取得各个字段的内容.这个特色让使用者易于用 awk 编写 reform ...