首页 > PHP头条 > 正文

你好,我是你的小可爱“GO语言”

原创 2018-03-13 0 433
1.jpg

本专栏全方面解读软件领域相关知识,偏向技术深度内容,主要覆盖编程语言、系统架构、开源框架、技术管理等,又分为多个主题,每个主题包含多篇文章。

本文是专栏的第一篇文章,也是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的编码风格:

  1. Package main

  2. import "fmt"

  3. func main(){

  4. fmt.Println("hello,world");

  5. }

如何运行上述代码呢?GO语言是编译型语言,GO的工具链将程序的源文件转变成机器相关的原生指令(二进制),最基础的工具是run命令,它可以将一个或者多个GO源文件(以.go为后缀)进行编译、链接,链接后就开始运行生成的可执行文件,看一下实际的操作:

1.$go run helloworld.go

打印:hello,world

上面的编译、链接、运行,都是一次性工作,也就是说下次运行go run命令时,内部流程会全部重做。我们可以通过go build命令生成二进制程序,随后就可以任意调用了,如下所示:

  1. $go build helloworld.go

  2. $./helloworld

  3. 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系统头文件时,这些文件里的名字都有了定义,如果与你用的名字冲突,就可能引起各种奇怪的现象。综合各种信息,建议不要使用”_”、”$”、空格作为命名开始,以免不利于阅读或者产生奇怪的问题。

对于类名,俄罗斯Java专家Yegor Bugayenko给出的建议是尽量采用现实生活中实体的抽象,如果类的名字以“-er”结尾,这是不建议的命名方式。他指出针对这一条有一个例外,那就是工具类,例如StringUtils、FileUtils、IOUtils。对于接口名称,不要使用IRecord、IfaceEmployee、RedcordInterface,而是使用现实世界的实体命名。

当然,上述都是针对Java的,与GO无关,GO语言受C语言的影响更多。

变量概述

GO语言包括四种主要的声明方式:变量(var)、常量(const)、类型(type)和函数(func)。我们来聊聊变量相关的几点感受:

1. var声明创建一个具体类型的变量,然后给它附加一个名称,并且设置它的初始值,每一个声明有一个通用的形式:var name type = expression。多说一句,GO语言允许空字符串,不会报空指针错误。

2. 可以采用name:=expression方式声明变量,注意:=表示声明,=表示赋值。

如果一个变量生命为var x int,表达式&x(x的地址)获取一个指向整形变量的指针,它的类型是整形指针(*int)。如果值叫做p,我们可以说p指向x,或者p包含x的地址。p指向的变量写成*p。表达式*p获取变量的值(此例为整形),因为*p代表一个标量,所以它也可以出现在赋值操作符左边,用于更新变量的值。

  1. x:=1

  2. p:=&x//p是整形指针,指向x

  3. fmt.Println(*p)//输出“1”

  4. *p=2//等同于x=2

  5. fmt.Println(x)//输出“2”

注意,相较于Java的NULL,GO表示指针类型的零值是nil。

3. 使用内置的new函数创建变量,表达式new(T)创建一个未命名的T类型变量,初始化为T类型的零值,并返回其地址(地址类型为*T)。使用new创建的变量和取其地址的普通局部变量没有什么区别,只是不需要引入(或声明)一个虚拟的名字,通过new(T)就可以直接在表达式中使用。

  1. func newInt() *int{

  2. return new(int)

  3. }

等同于:

  1. func newInt() *int{

  2. var dummy int

  3. return &dummy

  4. }

gofmt工具

GO语言提供了很多工具,例如gofmt,它可以将代码格式化,我们来看看具体是怎么实现的。

Gofmt会读取程序并且进行格式化,例如gofmt filename命令,它会打印格式化后的代码。我们来看一个示例程序(程序名demo.go):

1.jpg

运行gofmt demo.go之后,输出的代码如下:

2.jpg

垃圾回收

对于高级语言的垃圾回收器,如何知道一个变量是否应该被回收?基本思路是每一个包级别的变量,以及每一个当前执行函数的局部变量,可以作为追溯变量的路径的源头,通过指针和其他方式的引用可以找到变量。如果变量的路径不存在,那么标量变得不可访问,因此它不会影响任何其他的计算过程。

因为变量的生命周期是通过它的是否可达来确定的,所以局部变量可以在包含它的循环的一次迭代之外继续存在。

GO语言的垃圾回收器设计的目标就是非阻塞式回收器,GO1.5实现了10毫秒内的回收(注意,根据实验证明,这种说法只有在GC有足够CPU时间的情况下才能成立)。从设计原理上来看,Go的回收器是一种并发的、三基色的、标记并清除回收器,它的设计想法是由Dijkstra在1978年提出的,目标是跟现代硬件的属性和现代软件的低延迟需求非常匹配。

总结

综上所述,每一门新的语言的出现都是有原因的,一般来说是两大原因:

1. 出现了当前主流语言无法解决的复杂场景或具体问题;

2. 需要性价比更高的语言。

我想,除了贝尔实验室会做一些完全出于个人情怀的东西以外,没有哪家会随便布局无出路的新技术吧。正如Rob Pike所说,“复杂性是以乘积方式增长的”,为了解决某个问题,一点点地将系统的某个部分变得更加复杂,不可避免地也给其他部分增加了复杂性。

在不断要求增加系统功能、选项和配置,以及快速发布的压力之下,简单性往往被忽视了。要实现简单性,就要求在项目的一开始就浓缩思想的本质,并在项目的整个生命周期制定更具体的准则,以分辨出哪些变化是好的,哪些是坏的或致命的。

只要足够努力,好的变化就既可以实现目的,又能够不损害Fred Brooks所谓软件设计上的“概念完整性”。坏的变化就做不到这一点,致命的变化则会牺牲简单性而换取方便性。但是,只有通过设计上的简单性,系统才能在增长过程中保持稳定、安全和自洽。Go语言不仅包括语言本身及其工具和标准库,也保持了极端简单性的行为文化。

  • 相关标签:小可爱 语言 GO语言
  • 本文原创发布php中文网 ,转载请注明出处,感谢您的尊重!
  • 独孤九贱(4)_PHP视频教程

    江湖传言:PHP是世界上最好的编程语言。真的是这样吗?这个梗究竟是从哪来的?学会本课程,你就会明白了。 PHP中文网出品的PHP入门系统教学视频,完全从初学者的角度出发,绝不玩虚的,一切以实用、有用...

    独孤九贱(5)_ThinkPHP5视频教程

    ThinkPHP是国内最流行的中文PHP开发框架,也是您Web项目的最佳选择。《php.cn独孤九贱(5)-ThinkPHP5视频教程》课程以ThinkPHP5最新版本为例,从最基本的框架常识开始,将...

    ThinkPHP5实战之[教学管理系统]

    本套教程,以一个真实的学校教学管理系统为案例,手把手教会您如何在一张白纸上,从零开始,一步一步的用ThinkPHP5框架快速开发出一个商业项目。

    PHP入门视频教程之一周学会PHP

    所有计算机语言的学习都要从基础开始,《PHP入门视频教程之一周学会PHP》不仅是PHP的基础部分更主要的是PHP语言的核心技术,是学习PHP必须掌握的内容,任何PHP项目的实现都离不开这部分的内容,通...

    独孤九贱(1)_HTML5视频教程

    《php.cn原创html5视频教程》课程特色:php中文网原创幽默段子系列课程,以恶搞,段子为主题风格的php视频教程!轻松的教学风格,简短的教学模式,让同学们在不知不觉中,学会了HTML知识。 ...

    ThinkPHP5快速开发企业站点[全程实录]更新中...

    本课以最新版ThinkPHP5.0.10为基础进行开发,全程实录一个完整企业点,从后台到前台,从控制器到路由的全套完整教程,不论是你是新人,还是有一定开发经验的程序员,都可以从中学到实用的知识~~

    Thinkphp3.2.3个人博客开发

    ThinkPHP是一个快速、开源的轻量级国产PHP开发框架,是业内最流行的PHP框架之一。本课程以博客系统为例,讲述如何使用TP实战开发,从中学习Thinkphp的实践应用。模版下载地址:http:/...

    PHP实战天龙八部之仿爱奇艺电影网站

    本课程是php实战开发课程,以爱奇艺电影网站为蓝本从零开发一个自己的网站。目的是让大家了解真实项目的架构及开发过程

    独孤九贱(8)_php从零开始开发属于自己的php框架

    本课以一个极简的PHP开发框架为案例,向您展示了一个PHP框架应该具有的基本功能,以及具体的实现方法,让您快速对PHP开发框架的底层实现有一个清楚的认识,为以后学习其实的开发框架打下坚实的基础。

    独孤九贱(3)_JavaScript视频教程

    javascript是运行在浏览器上的脚本语言,连续多年,被评为全球最受欢迎的编程语言。是前端开发必备三大法器中,最具杀伤力。如果前端开发是降龙十八掌,好么javascript就是第18掌:亢龙有悔。...

    直播实录:PHP魔鬼训练营[从零开始制作个人博客]

    本站9月直播课已经结束,本套教程是直播实录,没有报上名或者漏听学员福利来了,赶紧看看吧,说不定这里就有你的菜

    2018前端入门_HTML5

    轻松明快,简洁生动,让你快速走入HTML5的世界,体会语义化开发的魅力

    JavaScript极速入门_玉女心经系列

    JavaScript能够称得上是史上使用最广泛的编程语言,也是前端开发必须掌握的三技能之一:描述网页内容的HTML、描述网页样式的CSS以及描述网页行为的JavaScript。本章节将帮助大家迅速掌握...

    PHP用户注册登录系统视频教程

    《php用户注册登录系统》主要介绍网站的登录注册功能,我们会从最简单的实现登录注册功能开始,增加验证码,cookie验证等,丰富网站的登录注册功能

    独孤九贱(7)_Bootstrap视频教程

    Bootstrap 是最受欢迎的 HTML、CSS 和 JS 框架,用于开发响应式布局、移动设备优先的 WEB 项目。为所有开发者、所有应用场景而设计,它让前端开发更快速、简单,所有开发者都能快速上手...

    PHP学生管理系统视频教程

    《PHP学生管理系统视频教程》主要给大家讲解了HTML,PHP,MySQL之间的相互协作,实现动态的网页显示和获取数据.

    独孤九贱(2)_CSS视频教程

    《php.cn独孤九贱(2)-css视频教程》课程特色:php中文网原创幽默段子系列课程,以恶搞,段子为主题风格的php视频教程!轻松的教学风格,简短的教学模式,让同学们在不知不觉中,学会了CSS知识...

    弹指间学会HTML视频教程

    《弹指间学会HTML视频教程》从最基本的概念开始讲起,步步深入,带领大家学习HTML,了解各种常用标签的意义以及基本用法,学习HTML知识为以后的学习打下基础

    独孤九贱(6)_jQuery视频教程

    jQuery是一个快速、简洁的JavaScript框架。设计的宗旨是“write Less,Do More”,即倡导写更少的代码,做更多的事情。它封装JavaScript常用的功能代码,提供一种简便的...

    最新微信小程序开发视频教程

    《最新微信小程序开发视频教程》本节课程是由微趋道录制,讲述了如何申请一个微信小程序,以及开发中需要使用哪些工具,和需要注意哪些等。

    • -

      学生

    • 90篇
      文章总数
    • 433
      文章总浏览数

    头条

    推荐视频教程

  • javascript初级视频教程
  • jquery 基础视频教程
  • javascript三级联动视频教程
  • 独孤九贱(3)_JavaScript视频教程
  • 独孤九贱(6)_jQuery视频教程
  • 最新更新