golang之defer简介

defer是GO中一个非常重要的关键字,类似Java中的finally可以用来指定在函数返回前执行的代码.利用这个功能我们可以用来做一些资管清理的动作.但是在使用中需要注意一些细节问题,否则就会造成意想不到的bug.

golang自动生成版本信息

如果需要知道使用的软件的版本信息,我们使用cmd --version或者cmd -v就可以查看当前的版本信息了.我们用GO开发一个工具,如果要提供工具的版本信息,最先能想到的方法就是读取命令行参数.那有没有更好的办法的呢?答案肯定是了.下面介绍的方式是以前没有想到的.

如何获取goroutine的id

使用Java的时候很容易得到线程的名字,比如”Thread.currentThread().getName”,这样就可以进行一些监控操作或者设置线程相关的一些数据。当转向Golang开发的时候,却发现Go语言并没有提供获取当前goroutine id的操作。这是Golang的开发者故意为之,避免开发者滥用goroutine id实现goroutine local storage (类似java的”thread-local” storage), 因为goroutine local storage很难进行垃圾回收。因此尽管以前暴露出了相应的方法,现在已经把它隐藏了。当然Go的这种隐藏的做法还是有争议的,有点因噎废食。在debug log的时候goroutine id是很好的一个监控信息。本文介绍了两种获取goroutine id的方法。

50个go新手开发常见的错误

原文:http://devs.cloudimmunity.com/gotchas-and-common-mistakes-in-go-golang/
转自:http://colobu.com/2015/09/07/gotchas-and-common-mistakes-in-go-golang/

Go是一门简单有趣的语言,但与其他语言类似,它会有一些技巧。这些技巧的绝大部分并不是Go的缺陷造成的。如果你以前使用的是其他语言,那么这其中的有些错误就是很自然的陷阱。其它的是由错误的假设和缺少细节造成的。如果你花时间学习这门语言,阅读官方说明、wiki、邮件列表讨论、大量的优秀博文和Rob Pike的展示,以及源代码,这些技巧中的绝大多数都是显而易见的。尽管不是每个人都是以这种方式开始学习的,但也没关系。如果你是Go语言新人,那么这里的信息将会节约你大量的调试代码的时间.

java异常处理最佳实践

文章转自:http://www.importnew.com/20139.html

异常处理在编写健壮的 Java 应用中扮演着非常重要的角色。异常处理并不是功能性需求,它需要优雅地处理任何错误情况,比如资源不可用、非法的输入、null输入等等。Java提供很多异常处理特性,通过内置的try、catch、finally关键字实现。Java 同样允许创建新的异常和使用throw和throws抛出该异常。在实践中,异常处理不单单是知道语法这么简单。编写健壮的代码更像是一种艺术,而不是一门科学,在接下来的文章中,我们将讨论 Java 异常处理的最佳实践。这些最佳实践遵循标准的JDK库,以及几个开源代码库,来更好地应对错误和异常处理。这还是为 Java 程序员提供的编写健壮代码的袖珍参考手册。

golang错误处理

一、概述

Go是一门simple language,常拿出来鼓吹的就是作为gopher习以为傲的仅仅25个关键字^_^。因此Go的错误处理也一如既往的简单。我们知道C语言错误处理以返回错误码(errno)为主流,目前企业第一语言Java则用try-catch-finally的处理方式来统一应对错误和异常(开发人员常常因分不清楚到底哪些是错误,哪些是异常而滥用该机制)。Go则继承了C,以返回值为错误处理的主要方式(辅以panic与recover应对runtime异常)。但与C不同的是,在Go的惯用法中,返回值不是整型等常用返回值类型,而是用了一个 error(interface类型)。

关于go你必须知道的7件事

Go以简洁著称,但简洁中不乏值得玩味的小细节。这些小细节不如goroutine、interface和channel那样”高大上”,”屌 丝”得可能不经常被人注意到,但它们却对理解Go语言有着重要的作用。这里想挑出一些和大家一起通过详实的例子来逐一展开和理解。本文内容较为基础,适合初学者,高手可飘过:)

go自带工具build的用法

用法:

usage: build [-o output] [-i] [build flags] [packages]

Build 会编译哪些通过import导入的包和那些包依赖的包,但是不会install 编译的结果。如果build的参数是一系列以.go结尾的文件,则build会将它们每一个看做是一个单独的包。当编译一个单独的main包时,build会将结果写入一个可执行的文件,文件名称默认是main方法所在的文件名。当编译多个包或一个非main包时,build会编译这些包,但是会丢掉结果对象。该操作仅用来检查这些包是否可以被编译。

|