使用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. linux切换用户

    当前使用root账户 [root@localhost chucklu]# cd[root@localhost ~]# pwd/root 切换到普通账户 [root@localhost ~]# su c ...

  2. php 连接字符串. ZEND_ASSIGN_CONCAT/ZEND_CONCAT原理

    0.php代码 <?php $a='abc'; $b='def'; $c='ghi';$d='jkl'; $a.=$b.$c.$d; 1.BNF范式(语法规则) expr_without_var ...

  3. SharePoint 2010 使用自定义aspx页面替换列表默认的新建(NewForm.aspx),查看(DispForm.aspx)和编辑(EditForm.aspx)页面

    转:http://www.cnblogs.com/sygwin/archive/2011/11/04/2236678.html 如何使用自定义的aspx页(比如Application Page)替换列 ...

  4. LeetCode题解——Two Sum

    题目地址:https://oj.leetcode.com/problems/two-sum/ Two Sum Given an array of integers, find two numbers ...

  5. Jquery UI的datepicker插件使用方法

    原文链接;http://www.ido321.com/375.html Jquery UI是一个非常丰富的Jquery插件,并且UI的各部分插件可以独自分离出来使用,这是其他很多Jquery插件没有的 ...

  6. highcharts图表的图例legend怎么改变显示位置

    一.将图例Legend放于图表右侧1.设置chart的marginRight属性值:chart: { marginRight: 120}2.设置legend图例属性值如下 legend: { alig ...

  7. 在Mac上通过Sublime、Skim编辑LaTeX

    转自:http://painterlin.com/2014/08/10/Using-LaTeX-with-Sublime-and-Skim-for-Mac.html Sublime Text是一款非常 ...

  8. 【Hadoop学习】Apache Hadoop项目简介

    正在撰写,稍后来访……

  9. ffmpeg编码YUV420视频序列

    依旧是这里的测试序列 http://www.cnblogs.com/zzugyl/p/3678865.html测试了JM和libx264的编解码质量后来用ffmpeg转码 发现忘记了命令行转码的命令网 ...

  10. Getty – Java NIO 框架设计与实现

    前言 Getty是我为了学习 Java NIO 所写的一个 NIO 框架,实现过程中参考了 Netty 的设计,同时使用 Groovy 来实现.虽然只是玩具,但是麻雀虽小,五脏俱全,在实现过程中,不仅 ...