摘要:
Go语言将错误和异常两者区分对待。1、Go语言中处理错误的惯用法是将错误以函数或者方法最后一个返回值的形式将其返回,并总是在调用它的地方检查返回的错误值。2、对于“不可能发生的事情”称为异常,可使用panic()函数向调用栈传播异常。何时使用recover()捕捉异常,何时让panic()继续传播呢? 2.1 自定义的包,最好不使用panic()。如果要使用,应该使用recover()捕捉异常并转换为一个错误值返回; 2.2 准备部署或发布程序时,应该使用recover()捕捉异常并转换为一个错误值返回并记录; 2.3 开发阶段可以使用panic()函数中断程序的执行以强制发生错误,使得... 阅读全文
摘要:
何时关闭通道:第一,只有在后面要检查通道是否关闭的时候才需要显式地关闭通道;第二,应该由发送端的goroutine关闭通道,而不是由接收端的goroutine来完成;第三,如果通道并不需要检查是否被关闭,那么不关闭这些通道并没有什么问题,因为通道非常轻量,因此它不会像打开文件不关闭那样耗尽系统资源。两个陷阱:1、程序完成时我们没得到任何结果因为主gorouting退出后,其他的工作goroutine也会退出,所以必须保证所有工作goroutine都完成后才让主goroutine退出。2、死锁有两种情况下可能发生死锁:第一种是即使所有的工作都已经完成了,但是主goroutine和工作gorout 阅读全文
摘要:
对于接口,应使用组合而非继承的方式扩展;对于结构体,应定义独立的结构体,而非用嵌套模拟继承。值接收者和指针接收者:1、对于不可变类型创建只接受值接收者的方法,而为可变的类型创建接受指针接收者的方法。(对于可变类型,让部分方法接受值而让其他方法接受指针式完全可行的,但是使用中可能不太方便。)2、对于大的结构体类型最好使用指针,这样能将开销保持在只传递一个指针的程度。 阅读全文