Golang——详解Go语言代码规范

本文始发于我的公众号:TechFlow,原创不易,求个关注java


今天是Golang专题的第二篇,咱们来看看Go的语言规范。node

在咱们继续今天的内容以前,先来回答一个问题。git

有同窗在后台问我,为何说Golang更适合分布式系统的开发?它和Java相比有什么优点吗?程序员

其实回答这个问题须要涉及不少概念,好比操做系统当中关于进程、线程、协程等不少概念。咱们将这些内容进行简化,举一个最简单的线程的例子。咱们来写一段在java当中实现多线程的例子:github

public class MyThread implemnts Runnable {
    public void run() {
      System.out.println("I am a thread")
    }
}

public class Test {
    public static void main(String args[]) {
        MyThread thread1 = new MyThread();
        thread1.start();
    }
}
复制代码

咱们再来看看Golang:golang

func run() {
    fmt.Println("I am a Thread")
}

func main() {
    go run()
}
复制代码

这么一对比是否是简单不少?web

Golang的语言规范

你们都知道程序员最大的分歧之一就是花括号到底应该写在哪一行,有另写一行的,也有跟在循环体后面的。这两拨人分红了两个流派,彼此征战不休,也衍生出了许多段子。express

为了统一风格,不少语言对代码风格作了规范。好比Python就去掉了花括号,而使用空格来进行代码缩进。然而不幸的是,有些人缩进用四个空格,也有些人用tab,这双方又造成了阵营,彼此争吵不停……编程

也许Golang的开发者曾经饱受代码风格争吵的苦恼,因此Golang作了一个划时代的事情,它严格限制了代码风格,强行统一你们都必须使用同一套风格,不然就分分钟报错给你看。因此在咱们进行具体的语法学习以前,先从语言规范开始,不然等咱们后面养成了很差的习惯再想要改正就会成本很高。其实改正代码风格是一件很难的事情,老实说个人代码风格不是很好,老是使用一些cur、pnt、node、u、v这种简单的变量,这也是当年打acm留下来的习惯,想改一时半会蛮难的。因此你们必定要在初期就养成好习惯,坏习惯就留给我一我的吧(大雾)。多线程

package规范

Golang的语言规范不少,涉及的面很广,有些咱们暂时用不到,咱们先挑基础的说。首先是package规范,对于package来讲它的名字应该和目录保持一致,采起有意义的包名,不要起一些别人看不懂的名字。好比test、unit这种,而且不能和标准库冲突。

其次是咱们在引包的时候,须要注意不要使用相对路径,而应该使用绝对路径。

// wrong
import "../../../repo"

// correct
import "github.com/repo/package
复制代码

固然咱们能够装一个goimport工具,帮助咱们自动引包。可是自动引包也会有坑,尤为是当目录下存在两个包名称同样的时候,有可能会引入错误,须要咱们本身留意。

代码风格规范

Go语言当中规定了咱们应该使用驼峰标准来命名变量,不能使用_。在Go当中首字母大写表示结构体中的变量或者是包中的函数public,若是是小写则表示是private,这一点尤为须要注意。刚开始写go的时候都会很不习惯,所以踩坑是常有的事。

golang当中是有常量的,golang当中的常量同样用驼峰标准,首字母大写。好比咱们起一个常量叫作app_env,表示当前app运行的环境,咱们必需要这样定义:

const AppEnv = "env"
复制代码

另外一点是Golang的设计者认为行尾加上分号毫无必要,因此在编译器当中添加了会在行尾自动加上分号的功能。因此咱们能够加也能够不加,可是通常认为没有必要这么作。因此广泛来讲,除了在循环体或者是判断条件当中,咱们通常是不写分号的。固然也有特殊状况,好比你想要把多条语句写在一行的时候:

var a intvar b float;
a = 3; b = 3.2;
复制代码

固然仍是通常不推荐这么干,建议分红多行,更加美观。

另一点是golang当中全部的变量和包都必须用上,不容许定义没有使用的东西,不然也会报错。也就是说严格限制了咱们写代码时候的谨慎。不能随意申请用不到的变量,大多数语言当中没有这样的限制,可是golang当中作了限制,因此咱们写代码的时候要当心。

另一点是关于花括号,在golang当中严格限制了花括号写在当前行,而不是另起一行。

// wrong
if expression 
{
  ...
}

// correct
if expression {
  ...
}
复制代码

从上面这个例子咱们还能够注意到一点,就是在golang当中if后面的条件不加括号,这点和Python同样。可是若是你写惯了java或者是C++刚开始可能会不太适应。

最后一点是golang的代码规范检测工具golint当中规定了全部的函数以及结构体头部必需要写注释,而且对注释的规范也进行了限制。注释的规范是名称加上说明,若是不写或者是不规范的话,代码虽然能够运行,可是没法经过golint的规范检测。通常来讲公司的开发环境都会作限制,只有经过golint规范检测的代码才能够提交发布。

// HelloWorld print hello world
func HelloWorld() {
    fmt.Println("Hello World")
}
复制代码

另一点是golang不支持隐式类型转换,好比int和int32以及int64,会被视做是不一样的类型。若是咱们将一个int32的变量赋值给int类型,则会引发报错,必需要咱们手动转换。这固然增长了编码时候的工做,可是也避免了不少由精度不同产生的问题。

除了这些以外,golang当中还定义了对结构体定义以及错误处理等内容的规范。可是对于咱们初学者而言,目前这些是必需要了解的,其余的内容能够等咱们后续碰见了再熟悉。

一门语言对于代码风格作了严格的规范限制对于初学者而言多是一件比较蛋疼的事情,由于要记的东西变多了,咱们不只要学会语法,还要搞清楚这些规范。可是当咱们熟悉了或者是工做了以后,会发现这实际上是一件好事。对于多人协做的场景而言,你们都遵照同样的规范会大大提高代码交流以及协做的效率。若是大家看过其余代码风格和本身彻底不一样的人的代码以后,相信大家对于这点必定会有更深的认识。

总结

从规范的严格程度以及对面向对象的阉割程度看起来,golang简直不像是一门新生的语言,倒有些上世纪老派语言的风格。可是恰恰golang又有不少新鲜特性,好比容许函数值返回多个结果,支持匿名函数以及部分函数式编程的功能等等。在初学的阶段,我也很是抗拒它,多是由于Python写得太多了,习惯了动态语言。可是随着对这门语言了解的深刻,我愈来愈多地发现了它这些设计理念背后的思考和智慧,慢慢对它改观,时至今日,我已经再也不怀疑这是一门优秀的语言,这几年的流行并非没有道理的。

另外很重要的一点是,由于golang太特立独行了,因此常常会让我思考它这么作背后的用意是什么?这么一思考,加上查阅一些资料,可以发现不少以前思惟当中的盲点。在以前学习语言的时候,我是绝对不会去思考语言的设计者为何要这么设计的,只会依葫芦画瓢,照着把相关的内容学会仅此而已。这样的思考除了可以提高对于语言自己的理解以外,也可以提高对问题场景的思考和理解,对于工程师而言,后者实际上是更为重要的。

固然这些内容我光说是没有用的,也须要屏幕前的你用心去体会。

但愿你们都能感觉到golang的魅力,都能在此过程中收货成长,加油!若是以为有所收获,请顺手点个在看或者转发吧,大家的举手之劳对我来讲很重要。

相关文章
相关标签/搜索