本专栏全方面解读软件领域相关知识,偏向技术深度内容,主要覆盖编程语言、系统架构、开源框架、技术管理等,又分为多个主题,每个主题包含多篇文章。
本文是专栏的第一篇文章,也是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为后缀)进行编译、链接,链接后就开始运行生成的可执行文件,看一下实际的操作:
1.$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系统头文件时,这些文件里的名字都有了定义,如果与你用的名字冲突,就可能引起各种奇怪的现象。综合各种信息,建议不要使用”_”、”$”、空格作为命名开始,以免不利于阅读或者产生奇怪的问题。
对于类名,俄罗斯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代表一个标量,所以它也可以出现在赋值操作符左边,用于更新变量的值。
x:=1
p:=&x//p是整形指针,指向x
fmt.Println(*p)//输出“1”
*p=2//等同于x=2
fmt.Println(x)//输出“2”
注意,相较于Java的NULL,GO表示指针类型的零值是nil。
3. 使用内置的new函数创建变量,表达式new(T)创建一个未命名的T类型变量,初始化为T类型的零值,并返回其地址(地址类型为*T)。使用new创建的变量和取其地址的普通局部变量没有什么区别,只是不需要引入(或声明)一个虚拟的名字,通过new(T)就可以直接在表达式中使用。
func newInt() *int{
return new(int)
}
等同于:
func newInt() *int{
var dummy int
return &dummy
}
gofmt工具
GO语言提供了很多工具,例如gofmt,它可以将代码格式化,我们来看看具体是怎么实现的。
Gofmt会读取程序并且进行格式化,例如gofmt filename命令,它会打印格式化后的代码。我们来看一个示例程序(程序名demo.go):
运行gofmt demo.go之后,输出的代码如下:
垃圾回收
对于高级语言的垃圾回收器,如何知道一个变量是否应该被回收?基本思路是每一个包级别的变量,以及每一个当前执行函数的局部变量,可以作为追溯变量的路径的源头,通过指针和其他方式的引用可以找到变量。如果变量的路径不存在,那么标量变得不可访问,因此它不会影响任何其他的计算过程。
因为变量的生命周期是通过它的是否可达来确定的,所以局部变量可以在包含它的循环的一次迭代之外继续存在。
GO语言的垃圾回收器设计的目标就是非阻塞式回收器,GO1.5实现了10毫秒内的回收(注意,根据实验证明,这种说法只有在GC有足够CPU时间的情况下才能成立)。从设计原理上来看,Go的回收器是一种并发的、三基色的、标记并清除回收器,它的设计想法是由Dijkstra在1978年提出的,目标是跟现代硬件的属性和现代软件的低延迟需求非常匹配。
总结
综上所述,每一门新的语言的出现都是有原因的,一般来说是两大原因:
1. 出现了当前主流语言无法解决的复杂场景或具体问题;
2. 需要性价比更高的语言。
我想,除了贝尔实验室会做一些完全出于个人情怀的东西以外,没有哪家会随便布局无出路的新技术吧。正如Rob Pike所说,“复杂性是以乘积方式增长的”,为了解决某个问题,一点点地将系统的某个部分变得更加复杂,不可避免地也给其他部分增加了复杂性。
在不断要求增加系统功能、选项和配置,以及快速发布的压力之下,简单性往往被忽视了。要实现简单性,就要求在项目的一开始就浓缩思想的本质,并在项目的整个生命周期制定更具体的准则,以分辨出哪些变化是好的,哪些是坏的或致命的。
只要足够努力,好的变化就既可以实现目的,又能够不损害Fred Brooks所谓软件设计上的“概念完整性”。坏的变化就做不到这一点,致命的变化则会牺牲简单性而换取方便性。但是,只有通过设计上的简单性,系统才能在增长过程中保持稳定、安全和自洽。Go语言不仅包括语言本身及其工具和标准库,也保持了极端简单性的行为文化。

在同一设置上工作太久或与他人共享PC。您可能会安装一些语言包,这通常会产生冲突。因此,是时候删除Windows11中不需要的显示语言了。说到冲突,当有多个语言包时,无意中按Ctrl+Shift会更改键盘布局。如果不注意,这将是手头任务的障碍。所以,让我们直接进入方法!如何从Windows11中删除显示语言?1.从设置按+打开“设置”应用,从导航窗格中转到“时间和语言”,然后单击“语言和地区”。WindowsI单击要删除的显示语言旁边的省略号,然后从弹出菜单中选择“删除”。在出现的确认提示中单击“

视频在当今社交媒体和互联网文化中扮演着愈发重要的角色,抖音,快手,B站等已经成为数以亿计用户的热门平台。用户围绕视频分享自己的生活点滴、创意作品、有趣瞬间等内容,与他人互动和交流。近期,大语言模型展现出了令人瞩目的能力。我们能否给大模型装上“眼睛”和“耳朵”,让它能够理解视频,陪着用户互动呢?从这个问题出发,达摩院的研究人员提出了Video-LLaMA,一个具有综合视听能力大模型。Video-LLaMA能够感知和理解视频中的视频和音频信号,并能理解用户输入的指令,完成一系列基于音视频的复杂任务,

说到这两年风靡全球的国产游戏,原神肯定是当仁不让。根据5月公布的本年度Q1季度手游收入调查报告,在抽卡手游里《原神》以5.67亿美金的绝对优势稳稳拿下第一,这也宣告《原神》在上线短短18个月之后单在手机平台总收入就突破30亿美金(大约RM130亿)。如今,开放须弥前最后的2.8海岛版本姗姗来迟,在漫长的长草期后终于又有新的剧情和区域可以肝了。不过不知道有多少“肝帝”,现在海岛已经满探索,又开始长草了。宝箱总共182个+1个摩拉箱(不计入)长草期根本没在怕的,原神区从来不缺整活儿。这不,在长草期间

开源语言模型生态系统正在兴起,这些生态系统为个人提供综合资源以创建用于研究和商业目的的语言应用程序。本文深入研究GPT4ALL,它通过提供全面的搭建模块,使任何人都能开发类似ChatGPT的聊天机器人,从而超越了特定的使用案例。什么是GPT4ALL项目?GPT4ALL可以在使用最先进的开源大型语言模型时提供所需一切的支持。它可以访问开源模型和数据集,使用提供的代码训练和运行它们,使用Web界面或桌面应用程序与它们交互,连接到Langchain后端进行分布式计算,并使用PythonAPI进行轻松集

机器会不会思考这个问题就像问潜水艇会不会游泳一样。——Dijkstra早在ChatGPT发布之前,业界就已经嗅到了大模型带来的变革。去年10月14日,圣塔菲研究所(Santa Fe Institute)的教授Melanie Mitchell和David C. Krakauer在arXiv发布了一篇综述,全面调研了所有关于「大规模预训练语言模型是否可以理解语言」的相关争论,文中描述了「正方」和「反方」的论点,以及根据这些论点衍生的更广泛的智力科学的关键问题。论文链接:https://arxiv.o

Python 中的 main 函数充当程序的执行点,在 Python 编程中定义 main 函数是启动程序执行的必要条件,不过它仅在程序直接运行时才执行,而在作为模块导入时不会执行。要了解有关 Python main 函数的更多信息,我们将从如下几点逐步学习:什么是 Python 函数Python 中 main 函数的功能是什么一个基本的 Python main() 是怎样的Python 执行模式Let’s get started什么是 Python 函数相信很多小伙伴对函数都不陌生了,函数是可

计算机硬件能直接识别并执行的语言是机器语言。机器语言是机器能直接识别的程序语言或指令代码,无需经过翻译,每一操作码在计算机内部都有相应的电路来完成它。

Microsoft的AzureAI文本转语音服务允许你将文本转换为不同语言的语音。今年年初,AzureAI文本转语音引入了JennyMultilingual语音,允许客户跨区域设置以一致的角色生成语音。到目前为止,Jenny多语言语音支持14种语言。今天,Microsoft宣布将多语言语音功能扩展到41种语言和口音。今天,Microsoft还宣布了一个新的男声(RyanMultilingual),作为其多语言产品组合的一部分。这些新语音具有输入文本的自动语言预测功能。因此,这消除了手动标记的需要

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

PhpStorm Mac 版本
最新(2018.2.1 )专业的PHP集成开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境