作者:empty 页数:97 出版社:empty |
作者介绍郝林,从事互联网软件研发和管理工作已有15年,在银行、电信、社交网络、互联网金融、电子商务、大数据等领域都工作过。我对Go语言和Julia语言都情有独钟, 并且目前正在独立从事编程教育研究、专业内容输出、在线社群运营等工作。我制作和发布过一些很受欢迎的免费教程、技术图书和付费专栏,其中就包括本教程。另外还有(按时间排序):慕课网的免费教程《Go语言第一课》、人邮图灵的原创技术图书(GO井发编程实战》、极客时间的付费专栏《Go语言核心36讲)等,
本教程的由来这份Go命令教程原先是我撰写的图书《Go井发编程实战》中的一部分。这部分内容与并发编程的关系不大,故被砍掉。但是它是有价值的,也算是我对Go语言官方提供的标准命令的一个学习笔记。所以,我觉得应该把它做成免费资源分享给大家。经出版社的认可,我将这份教程放在这里供广大Go语言爱好者阅读,信息更新:·2017-04-01:《Go并发编程实战》第2版已经出版了。相关源本教程在Git hub上的地址在这里。如果你喜欢本教程, 请不音Star.如果你想贡献一份力量, 欢迎提交PullRequest(提示:请小步pr, 避免大刀阔片) 。针对G01.3和1.4版本的教程已被放入分支g01.3.而主分支此后一段时间内会致力于针对Go1.5进行更新。本教程中会提及一个名为go cz p的项目。该项目实际上是(Go并发编程实战》随书附带的示例项目。这本书中讲到的所有源码都在goc2p项目中, 我已在《Go并发编程实战》出版之时将goc2p项目放出。另外, 《Go并发编程实战)第2版的示例项目在这里,可供参考。关于协议我希望这个项目中的内容永远是免费的。也就是说,任何组织和个人不应该出于商业目的而摘取其中的内容。更详细的条款请阅读本项目中的LICENSE文件。版本信息书中内容及演示代码基于以下版本:
标准命令详解Go语言的1.5版本在标准命令方面有了重大变更。这倒不是说它们的用法有多大的变化,而是说它们的底层支持已经大变样了。让我们先来对比一下Sa0R0T/pkg/to al/6平台粗关目录》中的内容。以下简称此目录为Go工具目录。插播:平台相关目录即以命名的目录,用于存放因特定平台的不同而不同的代码包归档文件或可执行文件。其中,代表特定平台的操作系统代号, 而则代表特定平台的计算架构代号。使用pen v命令便可查看它们在你的计算机中的实际值。1.4版本的Go工具目录的内容如下:1.5a518caddr2linedistobj dun ptour2.5c6a6l8gc gofixpackvet.5gfic8a8lcovernmppr oryac a下面是Go1.5版本的:可以看到,1.5版本的目录内容精简了不少。这是因为Go1.5的编译器、链接器都已经完全用Go语言重写了。而在这之前,它们都是用C语言写的,因此不得不为每类平台编写不同的程序并生成不同的文件。例如,8g、6g和5g分别是gc编译器在x 86(32bit) 、x 86-64(64bit) 和ARM计算架构的计算机上的实现程序, 相比之下, 用Go语言实现的好处就是, 编译器和链接器都将是跨平台的了。简要来说, Go 1.5版本的目录中的文件compile即是统一后的编译器, 而文件link则是统一后的链接器。本教程并不会讲解Go语言的编译器、链接器以及其它工具是怎样被编写出来的,并只会关注于怎样用好包含它们在内的Go语言自带的命令和工具。为了让讲解更具关联性,也为了让读者能够更容易的理解这些命令和工具,本教程并不会按照这些命令的字典顺序描述它们,而会按照我们在实际开发过程中通常的使用顺序以及它们的重要程度来逐一进行说明。现在,我们就先从gobuild命令开始。go build命令用于编译我们指定的源码文件或代码包以及它们的依赖包。例如, 如果我们在执行got uil n命令时不后跟任何代码包, 那么命令将试图编译当前目录所对应的代码包。例如,我们想编译goc2p项目的代码包10ggang.其中一个方法是进入1oggang目录并直接执行该命令:因为在代码包log uing中只有库源码文件和测试源码文件, 所以在执行go build命令之后不会在当前目录和goc2p项目的pkg目录中产生任何文件。插播:Go语言的源码文件有三大类,即:命令源码文件、库源码文件和测试源码文件,他们的功用各不相同,而写法也各有各的特点。命令源码文件总是作为可执行的程序的入,库源码文件一般用于集中放置各种待被使用的程序实体(全局常量、全局变量、接、结构体、函数等等)。而测试源码文件主要用于对前两种源码文件中的程序实体的功能和性能进行测试,另外,后者也可以用于展现前两者中程序的使用方法。另外一种编译10gging包的方法是:在这里, 我们把代码包longing的导入路径作为参数传递给go build命令。另一个例子:如果我们要编译代码包cnet/ctcp, 只需要在任意目录下执行命令go build cnet/ctcp即可。插播:之所以这样的编译方法可以正常执行, 是因为我们已经在环境变量GOP AT W中加入了goc2p项目的根目录(即-/go lang/goc2p/) , 这时, goc2p项目的根目录就成为了一个工作区目录。只有这样, Go语言才能正确识别我们提供的goc2p项目中某个代码包的导人路径。而代码包的导入路径是指, 相对于Go语言自身的源码目录(即s00R0DT/s re) 或我们在环境变量GO PATH中指定的某个目录的s re子目录下的子路径, 例如, 这里的代码包logging的绝对路径是-/go lang/goc2p/src/logging。而不论goc2p项目的根文件夹被放在哪儿,logging包的导入路径都是1ogging, 显而易见, 我们在称呼一个代码包的时候总是以其导人路径作为其称谓,言归正传,除了上面的简单用法,我们还可以同时编译多个Go源码文件:但是,使用这种方法会有一个限制。作为参数的多个Go源码文件必须在同一个目录中,也就是说,如果我们想用这种方法既编译lng ging包又编译basic包是不可能的。不过别担心, 在需要的时候, 那些被编译目标依赖的代码包会被go build命令自动的编译, 例如, 如果有一个导入路径为app的代码包, 同时依赖了10gging包