您为什么要使用Go语言? 基本上,它是一种简洁,简单,安全且快速的编译语言,具有出色的并发功能,并且可以轻松处理大型项目。 即使它最初是由Google开发的,它也是免费的开源。
语言的一位设计师Rob Pike表示:“ Go项目的目标是消除Google软件开发的缓慢性和笨拙性,从而使流程更具生产力和可扩展性。 该语言是由编写,阅读,调试和维护大型软件系统的人员所设计的。
按照这些目标,Go缺乏其他一些著名语言的许多功能-这实际上是一种优势。 Go不是面向对象的,它没有头文件或前向声明,没有类型层次结构,没有方法或运算符重载,没有泛型,没有用于运行时的虚拟机,它没有异常,也没有断言。
另一方面,Go可以很好地工作。 它可以在几秒钟内编译大型程序。 它具有开销较小的协程(称为goroutine ),可以通过通道进行有效通信。 它具有接口和接口组成。 另外,Go支持一流的函数,高阶函数,用户定义的函数类型,函数文字,闭包和多个返回值-换句话说,它支持强类型语言的函数式编程风格。
如果您渴望获得我上面提到的任何缺少的功能,则可能需要阅读Go语言常见问题解答中有关语言更改的讨论 :答案通常是“不,因为……”通常,最好的Go程序是从头开始设计以使用Go语言功能,而不是从使用其他抽象概念的其他语言中进行字面翻译。
安装Go
安装Go的简短说明出现在源存储库中。 您可以下载适用于Windows,MacOS和Linux 的Go二进制发行版,也可以从源代码安装Go 。 您会在GitHub上找到有关从源代码安装Go的说明 。
如果已经安装了Go,则应在https://golang.org/底部检查当前的构建版本,然后从命令行检查已安装的版本:
$ go version
如果您的安装已过期,请下载并安装当前版本。 重新启动所有打开的命令提示符(Windows)或终端。 重新运行go version
,并确保该版本符合您的期望; 如果不是,则可能需要在其他位置安装较旧版本的Go。
(不,我不是偏执狂。我设法通过Homebrew安装一个版本,并使用标准MacOS软件包在一个月左右后安装下一版本来描述我所描述的情况。它们安装在$PATH
上的不同位置$PATH
。弄清楚发生了什么事后,便可以使用Homebrew卸载旧版本。)
如果您需要支持和赔偿并且能够付款,则另一个安装选项是使用ActiveGo 。
一旦安装了Go编译器和工具,就应该按照安装页面的“ 测试安装 ”部分所述,完成编译和运行Go程序的练习。
设置您的Go环境
Go程序员通常将所有代码保存在一个带有bin
, pkg
和src
文件夹的工作区中。 在每个文件夹中,项目通常都具有与Git存储库相关的路径,例如GitHub或GitLab。 例如,我将所有Go语言代码都保留在~/work
,并将GOPATH
环境变量设置为$HOME/work
。 我的“ hello.go”源代码文件夹的路径为$GOPATH/src/github.com/meheller/hello
。
我还将GOPATH/bin
目录添加到我的路径中,以方便从任何目录运行Go程序:
export GOPATH=$HOME/work
export PATH=$PATH:$(go env GOPATH)/bin
默认情况下,Go语言实用程序将安装在GOPATH
,因此将GOPATH/bin
目录放在路径上还使您以及Go-aware编辑器和IDE可以更轻松地找到它们。 一旦知道所需的工具及其存储库路径,即可使用$go get <repo-path>
安装大多数实用工具。 通常可以通过Google搜索轻松找到存储库。 在某些情况下,Go的编辑器插件会自动安装实用程序(例如gocode
)。
如果您自己未设置, GOPATH
在Unix和MacOS上默认为$HOME/go
,在Windows上默认为%USERPROFILE%/go
。
Go语言工具,编辑器和IDE
几个Go实用程序作为编译器的软件包的一部分安装。 其他的可以使用go get
命令安装。 下面列出了最常用的Go命令行实用程序 。
名称 | 概要 |
---|---|
go | 管理Go源代码并运行此处列出的其他命令。 |
cgo | 启用创建调用C代码的Go包的功能。 |
cover | 用于创建和分析go test -coverprofile 生成的覆盖率配置文件的go test -coverprofile 。 |
fix | 查找使用该语言和库的旧功能的Go程序,并将其重写以使用较新的功能。 |
fmt | 格式化Go软件包。 也可以作为具有更多常规选项的独立gofmt 命令使用。 |
godoc | 提取并生成Go软件包的文档。 |
vet | 检查Go源代码并报告可疑构造,例如其参数与格式字符串不对齐的Printf 调用。 |
调用其中大多数命令的通常方式是作为go
子命令,例如go fmt
。 其他的则需要通过go tool
子命令来调用。 在我的安装中, go tool
返回以下已知工具列表:
$ go tool
addr2line
asm
buildid
cgo
compile
cover
dist
doc
fix
link
nm
objdump
pack
pprof
test2json
tour
trace
vet
这些工具记录在Go命令完整列表中 。 顺便说一句,在添加任何Go工具或任何使用Go工具的Go编辑器插件之前,请确保已设置GOPATH
。
从1.4版开始,Go储存库就不再提供任何编辑器或IDE支持,但是很多人都对Go有所了解,无论是开箱即用还是带有附加模块。 我在2017年的InfoWorld文章中讨论了其中许多内容 ; 还有一个由Golang社区维护的非正式列表 。
![去戈兰](https://i-blog.csdnimg.cn/blog_migrate/9156816aec18ff0c807df132275eaa0e.png)
GoLand IDE for Go。
我最喜欢的Go语言IDE是GoLand (如上所示;自从我在2017年撰写文章以来从Gogland重命名)和Komodo 。 两者都是免费试用的付费产品。
您将要安装Delve for Go调试。 在MacOS上,您可能还需要将命令行实用程序添加到Xcode,并可能添加到debugserver
的软链接,如6月5日在“问题发表”列表中的注释中所述 。 运行xcode-select --install
也可以解决有关查找debugserver
问题,尽管是蛮力的。
我最喜欢的带有GUI的Go-aware编辑器是Atom和Visual Studio Code ; 两者都是免费的。 如果选择Atom,请考虑添加go-plus和go-debug软件包; 如果选择Visual Studio Code,请考虑添加vscode-go 。
如果您是Vim或Emacs的核心用户,那么请务必使用您所知道的信息,这不是我什至可以从您冷酷无情的手中撬开您的编辑器。 Vim-go添加了对Vim的Go语言支持,而go-mode添加了对Emacs的Go语言支持。
围棋之旅
您可以通过在线或离线“ A Go of Go”学到很多东西。 假设您已完成Go编译器和工具的本地安装,则可以通过运行以下两个命令来安装游览以在本地运行:
$ go get golang.org/x/tour/gotour
$ gotour
第二行应启动Web服务器并打开浏览器窗口。 这看起来与在线浏览完全一样,但是可能会运行得更快一些,因为它会在您自己的计算机上生成并运行代码示例。 完成后,在命令窗口中按Ctrl-C即可停止服务器。
游览分为三个部分。 我希望您完成整个测验,包括测验,但我将在下面总结每个部分作为概述,并向您提出一些问题。 我在文章结尾提供了我的问题的答案(不要偷看!)。
Go语言基础
![去基础](https://i-blog.csdnimg.cn/blog_migrate/f0adaae2af94b3e048aad5bf7d781dea.png)
入门基础课1
![上课1](https://i-blog.csdnimg.cn/blog_migrate/d6af6de0bab5e13742d44cabe31e06ba.png)
问题1.在此示例中,有三个软件包。 它们是什么,如何使用? 即使有rand
函数,为什么程序总是返回相同的数字?
请注意,我还没有宣布第二课 。 不要仅仅因为我没有对课程发表评论就跳过课程。
入门基础课3
![上课3](https://i-blog.csdnimg.cn/blog_migrate/6643e838e1bf9be6101feeb8cff5a1ba.png)
如果运行此示例,则会看到错误消息:
prog.go:9:14: cannot refer to unexported name math.pi
prog.go:9:14: undefined: math.pi
问题2.为什么会出现错误? 您如何解决该程序?
入门基础课4
![上第四课](https://i-blog.csdnimg.cn/blog_migrate/136ed410407453f765fcb823b30000fb.png)
问题3.将此声明与C中的等效声明进行比较。有什么区别?
入门基础课8
![上第8课](https://i-blog.csdnimg.cn/blog_migrate/8e17e0e77b10811efabcb4d4bf56ffa0.png)
问题4.为什么该程序不会引发任何错误?
入门基础课10
![上第10课](https://i-blog.csdnimg.cn/blog_migrate/b543562627bcaa696bf9a414ee7b8a44.png)
问题5. k
的类型是什么? 为什么? 如果类型不明显,请查看第11课以了解如何显示。
入门基础课12
![上十二课](https://i-blog.csdnimg.cn/blog_migrate/54a5bbd269efd2eb3ec9a5997ed30d66.png)
本课回答了我在第8课中提出的问题。
进行流控制第1课
![进行流量控制1](https://i-blog.csdnimg.cn/blog_migrate/aa8180eb2092b4ccd9f6a9aac7c5e7c2.png)
问题6.这与您喜欢的语言中的for
循环有何不同? 您认为您喜欢的语言中的其他循环结构是否必要? 接下来的三课中的其他信息会改变您的想法吗?
进行流控制第7课
![进行流量控制7](https://i-blog.csdnimg.cn/blog_migrate/971aa16c363ead914a7e8a0cef2dda9f.png)
在运行该程序之前,请先检查桌面并记下您认为它将打印的内容。 运行程序。 你说得对吗? 如果没有,您不了解什么?
进行流控制第8课
![进行流量控制8](https://i-blog.csdnimg.cn/blog_migrate/1016de38931d08f7dbc2d2637dc4fe5d.png)
这是在白板面试开始时可能要进行的练习。 锻炼自己的时间。 在解决问题时说出您的想法。
问题7.流量控制部分的其余部分很重要。 在完成第9到第13课之后,以C,Java或JavaScript程序员可以理解的方式解释Go switch
和defer
语句。
转到更多类型第1课
![走更多类型1](https://i-blog.csdnimg.cn/blog_migrate/07825289d42dd1085e98f7f2c24ef7a5.png)
在运行该程序之前,请先检查桌面并记下您认为它将打印的内容。 运行程序。 你说得对吗? 如果没有,您不了解什么?
您对Go有指针而不是指针算术有什么感觉?
遍历“更多类型”部分,直到进入第18课中的练习 。 问题8.您从Go数组和切片中学到了什么? 现在完成练习。
问题9.解释Go map
。 您为什么要使用一个?
完成更多类型部分。
问题10:尽管已编译,但Go可以用作功能性编程语言吗? 什么时候以及为什么要使用闭包?
Go方法和接口
![去方法接口](https://i-blog.csdnimg.cn/blog_migrate/fb0f28b2da41f0d86dd39f2e62061295.png)
从https://tour.golang.org/methods/1开始,完成本节中的所有25节课程。
问题11.完成后,请解释Go的方法和接口使用与C ++类有何不同。 你更喜欢哪个? 为什么?
并发
![并发](https://i-blog.csdnimg.cn/blog_migrate/3481a6b12e4725de62e698e446933334.png)
goroutine是Go并发的定义功能之一。 在并发部分的第一节课中 ,尝试对程序进行检查(如下),并写下您认为它将打印的内容。
![并发1](https://i-blog.csdnimg.cn/blog_migrate/cc1ac2cca95a9c282f7be70559970712.png)
运行程序。 你说得对吗? 解释实际发生的情况以及原因。
通道是隐式同步goroutine的方法。 在下一课 (下)中,再次尝试先检查程序,然后再运行它。
![并发2](https://i-blog.csdnimg.cn/blog_migrate/814e38165713568f8c8edf673a352271.png)
问题12.即使有两个goroutine调用,为什么在此示例中也只有一个通道?
select语句使goroutine等待多个通信操作。 语句在下面的程序中运行的顺序是什么?
![并发5](https://i-blog.csdnimg.cn/blog_migrate/581b67359120c246a24e37b8019662d5.png)
在白板面试中您可能还会遇到另一种等效二叉树的练习 。 安排自己的时间,并在实施解决方案时说明您的想法。 同样,就像在面试中一样,练习实施网络爬网程序 。
Go问题的答案
答案1.软件包由当前程序的package
语句指定,由正在使用的外部软件包的import
语句指定。 在这个简单的程序中, main
是程序自己的程序包,它将导入fmt
以使其可以打印,并导入math
/ rand
以便可以生成随机数。
rand
的各种方法都依赖于时钟时间来生成随机数,但是时间在gotour
环境中是固定的。 作为后续练习,找到报告时间的程序包和方法(提示:如果遇到问题,请在此处查看 ),然后使用它来打印当前时间。 在gotour
环境中多次运行此程序,并在本地生成程序并在您自己的计算机上多次运行它。
答案2. Go中的导出必须始终大写,并且语言区分大小写。 math.Pi
是正确的方法。
答案3.在C / C ++中,变量声明遵循<type> <variable list>
(例如int i, j, k;
),而在Go中,该类型位于变量名之后,并且可以省略,只要类型可以被推断。 在C / C ++中,返回类型在函数名称之前,而在Go中,返回类型在函数参数列表之后和函数体之前。 在C / C ++中,尾部分号是必需的。
答案4.不会引发错误,因为没有设置的Go变量将初始化为类型的零值,例如0
或false
。 在C / C ++中,编译器标记未初始化的变量。
答案5. k
是一个整数,因为它已初始化为3
。
From: https://www.infoworld.com/article/3290470/go-tutorial-get-started-with-google-go.html