入门指南:Google Go入门

您为什么要使用Go语言? 基本上,它是一种简洁,简单,安全且快速的编译语言,具有出色的并发功能,并且可以轻松处理大型项目。 即使它最初是由Google开发的,它也是免费的开源。

语言的一位设计师Rob Pike表示:“ Go项目的目标是消除Google软件开发的缓慢性和笨拙性,从而使流程更具生产力和可扩展性。 该语言是由编写,阅读,调试和维护大型软件系统的人员所设计的。

[也在InfoWorld上: Google Go语言真正有什么用处 找出! •Deep Dive PDF: 您需要了解有关Google Go的知识 •Changelog: Google Go中的新功能 点击Google的Go语言的功能 最好的Go语言IDE和编辑器 ]

按照这些目标,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程序员通常将所有代码保存在一个带有binpkgsrc文件夹的工作区中。 在每个文件夹中,项目通常都具有与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社区维护的非正式列表

去戈兰 IDG

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编辑器是AtomVisual Studio Code ; 两者都是免费的。 如果选择Atom,请考虑添加go-plusgo-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语言基础

去基础

入门基础课1

IDG
上课1 IDG

问题1.在此示例中,有三个软件包。 它们是什么,如何使用? 即使有rand函数,为什么程序总是返回相同的数字?

请注意,我还没有宣布第二 。 不要仅仅因为我没有对课程发表评论就跳过课程。

入门基础课3

上课3 IDG

如果运行此示例,则会看到错误消息:

prog.go:9:14: cannot refer to unexported name math.pi 
prog.go:9:14: undefined: math.pi

问题2.为什么会出现错误? 您如何解决该程序?

入门基础课4

上第四课 IDG

问题3.将此声明与C中的等效声明进行比较。有什么区别?

入门基础课8

上第8课 IDG

问题4.为什么该程序不会引发任何错误?

入门基础课10

上第10课 IDG

问题5. k的类型是什么? 为什么? 如果类型不明显,请查看第11课以了解如何显示。

入门基础课12

上十二课 IDG

本课回答了我在第8课中提出的问题。

进行流控制第1课

进行流量控制1 IDG

问题6.这与您喜欢的语言中的for循环有何不同? 您认为您喜欢的语言中的其他循环结构是否必要? 接下来的三课中的其他信息会改变您的想法吗?

进行流控制第7课

进行流量控制7 IDG

在运行该程序之前,请先检查桌面并记下您认为它将打印的内容。 运行程序。 你说得对吗? 如果没有,您不了解什么?

进行流控制第8课

进行流量控制8 IDG

这是在白板面试开始时可能要进行的练习。 锻炼自己的时间。 在解决问题时说出您的想法。

问题7.流量控制部分的其余部分很重要。 在完成第9到第13课之后,以C,Java或JavaScript程序员可以理解的方式解释Go switchdefer语句。

转到更多类型第1课

走更多类型1 IDG

在运行该程序之前,请先检查桌面并记下您认为它将打印的内容。 运行程序。 你说得对吗? 如果没有,您不了解什么?

您对Go有指针而不是指针算术有什么感觉?

遍历“更多类型”部分,直到进入第18课中练习问题8.您从Go数组和切片中学到了什么? 现在完成练习。

继续完成第23课中练习

问题9.解释Go map 。 您为什么要使用一个?

完成更多类型部分。

问题10:尽管已编译,但Go可以用作功能性编程语言吗? 什么时候以及为什么要使用闭包?

Go方法和接口

去方法接口 IDG

https://tour.golang.org/methods/1开始,完成本节中的所有25节课程。

问题11.完成后,请解释Go的方法和接口使用与C ++类有何不同。 你更喜欢哪个? 为什么?

并发

并发 IDG

goroutine是Go并发的定义功能之一。 在并发部分第一节课中 ,尝试对程序进行检查(如下),并写下您认为它将打印的内容。

并发1 IDG

运行程序。 你说得对吗? 解释实际发生的情况以及原因。

通道是隐式同步goroutine的方法。 在下一课 (下)中,再次尝试先检查程序,然后再运行它。

并发2 IDG

问题12.即使有两个goroutine调用,为什么在此示例中也只有一个通道?

select语句使goroutine等待多个通信操作。 语句在下面的程序中运行的顺序是什么?

并发5 IDG

在白板面试中您可能还会遇到另一种等效二叉树练习 。 安排自己的时间,并在实施解决方案时说明您的想法。 同样,就像在面试中一样,练习实施网络爬网程序

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变量将初始化为类型的零值,例如0false 。 在C / C ++中,编译器标记未初始化的变量。

答案5. k是一个整数,因为它已初始化为3

From: https://www.infoworld.com/article/3290470/go-tutorial-get-started-with-google-go.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值