GO语言系列(一):初识GO语言
作者:网友投稿 时间:2018-03-14 16:20
前言
本专栏全方面解读软件领域相关知识,偏向技术深度内容,主要覆盖编程语言、系统架构、开源框架、技术管理等,又分为多个主题,每个主题包含多篇文章。
本文是专栏的第一篇文章,也是GO语言系列的第一篇文章,今天我想从方方面面讲下我对于GO语言的大致印象,后续文章会深入介绍各个特性、编程技巧。

介绍
从历史说起,Go语言的作者是Robert Griesemer、Rob Pike和Ken Thompson,其中Ken Thompson以在UNIX和C语言开发中的巨大贡献为程序员所熟知。目前为止有哪些软件是用Go语言编写的呢?容器软件Docker、基础软件ETCD和Kubernetes,数据库软件TiDB和InfluxDB、消息系统NSQ、缓存组件GroupCache。
可以看到,几乎在基础架构软件的每一个领域,都涌现了由Go语言编写的新软件,这些软件的市场占有率持续攀高。除了作为基础架构软件的语言之外,Go语言作为服务器端通用语言的机会也越来越多,从Beego、Gorilla等Go语言Web框架的热门程度也可以看出一些发展趋势。
示例程序
我们通过一个简单的示例程序看看GO的编码风格:
Package main
import "fmt"
func main(){
fmt.Println("hello,world");
}
如何运行上述代码呢?GO语言是编译型语言,GO的工具链将程序的源文件转变成机器相关的原生指令(二进制),最基础的工具是run命令,它可以将一个或者多个GO源文件(以.go为后缀)进行编译、链接,链接后就开始运行生成的可执行文件,看一下实际的操作:
$go run helloworld.go
打印:hello,world
上面的编译、链接、运行,都是一次性工作,也就是说下次运行go run命令时,内部流程会全部重做。我们可以通过go build命令生成二进制程序,随后就可以任意调用了,如下所示:
$go build helloworld.go
$./helloworld
hello,world
这里我们提到了编译型语言,什么是编译型语言?如果编译型语言编写的程序需要被机器认识,它需要经过编译和链接两个步骤,编译是把源代码编译成机器码,链接是把各个模块的机器码和依赖库串联起来生成可执行文件。
我们来看看编译型语言的优缺点,由于预编译过程的存在,对代码可以进行优化,也只需要一次编译,运行时效率也会较高,并且可以脱离语言环境独立运行,缺点是修改后的整个模块需要编译。
相对编译型语言,解释型语言只会在运行程序的时候才逐行翻译。那么什么是链接?准确地说是链接和装入,即在编译后执行这两个步骤,程序才能在内存中运行。链接是通过连接器完成的,它将多个目标文件链接成一个完整的、可加载的、可执行的目标文件,整个过程包括了符号解析(将目标文件内的应用符号和该符合的定义联系起来)和将符号定义与存储器的位置联系起来两个步骤。
命名规范
GO语言中的函数、常量、变量、类型、语句、标签、包的名称有较统一的命名规则,名称的开头是一个字母或下划线,后面可以是任意数量的字符、数字或下划线,注意,GO语言是区分大小写的,并且关键字不可以作为名称。当遇到由单词组成的名称时,GO程序员一般使用“驼峰式”的风格。
说到这点,我们来看看Java的命名规范。以$为例,Oracle官网建议不要使用$或者_开始作为变量命名,并且建议在命名中完全不要使用“$”字符,原文是“The convention,however,is to always begin your variable names with a letter,not ‘$’ or ‘_’”。对于这一条,腾讯的看法是一样的,百度认为虽然类名可以支持使用“$”符号,但只在系统生成中使用(如匿名类、代理类),编码不能使用。
这类问题在StackOverFlow上有很多人提出,主流意见为大家不需要过多关注,只需要关注原先的代码是否存在”_”,如果存在就继续保留,如果不存在则尽量避免使用。也有一位提出尽量不适用”_”的原因是低分辨率的显示器,肉眼很难区分”_”(一个下划线)和”__”(两个下划线)。
我个人觉得可能是由于受C语言的编码规范所影响。因为在C语言里面,系统头文件里将宏名、变量名、内部函数名用_开头,因此当你#include系统头文件时,这些文件里的名字都有了定义,如果与你用的名字冲突,就可能引起各种奇怪的现象。综合各种信息,建议不要使用”_”、”$”、空格作为命名开始,以免不利于阅读或者产生奇怪的问题。



