使用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 ————————— ...
随机推荐
- Android开发之AIDL的使用一--跨应用启动Service
启动其他App的服务,跨进程启动服务. 与启动本应用的Service一样,使用startService(intent)方法 不同的是intent需要携带的内容不同,需要使用intent的setComp ...
- RazorEngine(未解决,留底)
TemplateServiceConfiguration templateConfig = new TemplateServiceConfiguration { BaseTemplateType = ...
- file的getPath getAbsolutePath和getCanonicalPath的区别
转自:http://www.blogjava.net/dreamstone/archive/2007/08/08/134968.html file的这几个取得path的方法各有不同,下边说说详细的区别 ...
- hdu 2844 Coins
Coins Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Submission(s): Accepted S ...
- (十二)学习CSS之box-sizing 属性
参考:http://www.w3school.com.cn/cssref/pr_box-sizing.asp CSS3 box-sizing 属性 定义和用法 box-sizing 属性允许您以特定的 ...
- 也用 Log4Net 之走进Log4Net (四)
转载地址:http://www.cnblogs.com/dragon/archive/2005/03/24/124254.html 我是转的别人的内容,我觉得他写的非常好,所以我把其中三分之二转了过来 ...
- sonar之安装篇
sonar 是一个很好的质量度量平台,安装方式有很多种.下面我教大家使用j2ee 容器的方式安装,我们使用tomcat 1.准备: 1.1 环境redhat linux1.2 下载sonar 从htt ...
- VS2008编写MFC程序--使用opencv2.4()
开始记录VS2008环境下学习OPENCV2.4 头文件: #pragma once #include "CvvImage.h" #include "opencv/cv. ...
- NGUI如何创建自己的精灵图集
说实话其实很简单,但是在不知道的情况下真的不好弄啊. 1. 选择你要制作精灵图集的图片,可以选择多张 2. 提倡使用快捷键Alt + Shift + M 会有如下窗口弹出,也可以NGUI --> ...
- MSP430看门狗
其实430的看门狗,与51的大同小异,都是为了防止程序跑飞而出现不可预知的错误而专门设定的,所以说,看门狗的应用,是项目马上要进行实际应用中必须要进行的一环,也是电子工程师必须掌握的一环,下面介绍一下 ...