以下文章摘自 Learn Go ,可从 Manning Publications 获取。
介绍围棋游乐场
开始使用 Go 的最快方法是导航到 play.golang.org 。 Go Playground 使您能够编辑、运行和试验 Go,而无需安装任何东西。当您点击 运行 按钮时,Playground 将在 Google 服务器上编译和执行您的代码并显示结果。
Go Playground 确实有一些限制。例如,您可以保存工作的唯一方法是单击 “共享” 按钮并保留书签列表。大多数 gophers 更喜欢使用文本编辑器和在他们自己的计算机上运行的命令行,但您可以只使用 Web 浏览器来熟悉 Go。
包和功能
当您访问 Go Playground 时,您将看到以下代码,这是一个很好的起点。
package main //<1>
import "fmt" //<2>
func main() { //<3>
fmt.Println("Hello, playground") //<4>
}
- 声明以下代码所属的包
-
使
fmt
(格式)包可供使用 - 声明一个名为 main 的函数
- 在屏幕上打印 Hello, playground
前面的清单虽然很短,但引入了三个关键字:
package
、
import
和
func
。每个关键字都保留用于特殊用途。
package
关键字声明此代码所属的包,在本例中为名为
main
的包。 Go 中的所有代码都组织成
包
。 Go 提供了一个标准库,其中包含数学、压缩、密码学、图像处理等包。每个包对应一个想法。下一行使用
import
关键字指定此代码将使用哪些包。
包包含任意数量的有用函数,例如,
math
包提供
Sin
、
Cos
、
Tan
和
Sqrt
(平方根)等函数。
fmt
包提供
格式化
输入和输出的函数。向屏幕显示文本是一项频繁的操作,因此这个包名缩写为
fmt
。
func
关键字声明一个函数,在本例中是一个名为
main
的函数。每个函数的主体都包含在大括号
{}
中,因此 Go 知道每个函数的开始和结束位置。
每个程序都需要从某个地方开始。当你运行一个用 Go 编写的程序时,它从
main
包中的
main
函数开始。没有
main
,Go 编译器会报错,因为它不知道程序将从哪里开始。
要打印
一行
文本,可以使用
Println
函数。
Println
以
fmt
为前缀,后跟一个点,因为它是由
fmt
包提供的。每次使用导入包中的函数时,该函数都会以包名和一个点为前缀。当您阅读用 Go 编写的代码时,您会立即清楚每个函数来自哪个包。
当您在 Go Playground 中运行该程序时,您会看到文本
Hello, playground
。要显示的文本包含在
"quotes"
中。你知道标点符号在英语中很重要;缺少逗号可能会改变句子的意思。 Go 严重依赖标点符号,例如大括号和引号,来理解您所写的内容。
实验
对 Go Playground 中的代码进行以下更改:
- 通过修改引号之间出现的内容来更改打印到屏幕上的文本。
- 尝试用中文、日语、俄语或西班牙语打印文本。 Go 支持所有语言的字符。
如果遇到困难,可以刷新浏览器返回到第一个示例。
执行计算
有时我认为年轻一点体重轻一点会很好。在这方面,火星可以提供很多东西。火星绕太阳一周需要 687 个地球日,较低的引力意味着所有物体的重量大约是它在地球上的 38%。
下面的程序帮助我计算了如果我住在火星上,我会有多年轻多轻。在 Go Playground 中键入并运行它。
package main //<1>
import "fmt" //<2>
func main() { //<3>
fmt.Println("Hello, playground") //<4>
}
- 给人类读者的评论
- 打印 79.443
- 打印 20
此代码以注释开头。当 Go 看到双斜杠时,它会忽略所有内容,直到行尾。计算机编程就是沟通。代码将您的指令传达给计算机,如果编写得当,它会将您的意图传达给其他人。评论仅供我们使用。
前面的清单多次调用
Print
函数以在一行中显示一个句子。正如您在
清单 1
中看到的,文本放在双引号之间。该程序还显示数学表达式的结果。
实验
在制定旅行计划之前,使用 Go 了解更多关于火星生命的信息:
-
你会在火星上称重多少?你几岁?将我的年龄 (38) 和体重 (210.0) 替换为您自己的。试试家人、宠物和朋友。
注意: 清单 2 以磅为单位显示重量,但该单位不会影响重量计算。无论您使用哪个单位,火星上的重量都是提供重量的 37.83%。另一方面,质量是 100% 相同的。
- 您是否注意到您在火星上的年龄显示为整数,而体重显示为小数?如果指定一个地球年恰好有 365.2425 天,会发生什么情况?
-
如果您使用
Println
函数而不是Print
会怎样? -
要显示文本、数字和数学表达式,您可以向
Print
函数传递一个用逗号分隔的参数列表:fmt.Print("I am ", 38*365/687, " years old on Mars.")
修改 清单 2, 仅调用一次
Print
函数即可显示相同的输出。
提示: 修改代码后,单击 Go Playground 中的 Format 按钮。它会自动重新格式化代码的缩进和间距,而不会改变它的作用。
常量和变量
既然我看到了去火星的好处,我的下一个问题是这次旅行需要多长时间。以光速旅行真的很理想。光在真空中以 恒定 速度传播,这使得数学变得容易。另一方面,地球和火星之间的距离 变化 很大,这取决于每颗行星在其绕太阳轨道上的位置。
下面的代码清单引入了两个新关键字
const
和
var
,分别用于声明常量和变量。
package main //<1>
import "fmt" //<2>
func main() { //<3>
fmt.Println("Hello, playground") //<4>
}
- 打印 186 秒
- 打印 1337 秒
第一个计算是基于火星和地球在附近,
distance
宣布并分配了 56,000,000 公里的初始值。然后为
distance
变量分配一个新值 401,000,000 公里,行星位于太阳的相对两侧。
lightSpeed
常量无法更改。如果你试图给它赋一个新值,Go 编译器会报错“cannot assign to lightSpeed”。
提示:
变量必须在使用前声明。如果你赋值给一个没有用
var
声明的变量,例如
speed = 16
,Go 会报错。这有助于发现错误,例如在您打算使用
distance
时不小心将值分配给
distant
。
实验
在 Go Playground 中输入 清单 3 并单击 Run 。光速非常方便;我没有听到有人问“我们到了吗?”
不幸的是,这些计算并不是最现实的。直接穿过太阳绘制路线可能会有问题,虽然以光速行进会很好,但当今最快的宇宙飞船只能达到 16 公里/秒。您可以通过以下更改将此程序带到地球上:
-
声明一个新的
speed
变量并使用它代替lightSpeed
来计算 16 公里/秒的行程持续时间。 - 将行程的持续时间打印为天数而不是秒数。 提示: 一个地球日有 86400 秒。
- 火星和地球在 2018 年 7 月将相距 57,600,000 公里。计算此发射窗口的行程持续时间。
用随机数伪造
找到一张负担得起的火星机票可能是一个挑战。如果有一个票务聚合器可以在每条空间线上列出票务,但谷歌搜索一无所获。看起来是个机会!
我没有真正的票务数据来构建票务聚合器,但一些随机数可以用于初始原型。
rand
包中的
Intn
函数将生成一个伪随机整数。将 10 传递给
Intn
会返回一个 0-9 之间的数字。以下示例显示 1-10 之间的两个随机数。
package main //<1>
import "fmt" //<2>
func main() { //<3>
fmt.Println("Hello, playground") //<4>
}
- 导入带括号的多个包
-
math/rand 是 rand 包的导入路径
注意: 每次运行该程序时,都会显示相同的两个伪随机数。时间在 Go Playground 中停止,结果被缓存,但这些数字足以满足我们的目的。
实验
在接下来的几年里,想象一些宇宙飞船能够以 30 公里/秒的速度行驶,但速度较慢的飞船仍在服役。编写一个程序,生成 16-30 之间的随机速度。
重复 for 循环
与
清单 4
中多次键入相同的代码不同,Go 提供了
for
关键字来重复相同的代码。一个
for
循环可用于生成 10 个随机数。稍后,将使用
for
循环生成 10 张随机票。
package main //<1>
import "fmt" //<2>
func main() { //<3>
fmt.Println("Hello, playground") //<4>
}
- 在计数小于 10 时重复 {} 之间的代码
- 增加计数,否则会一直循环下去
实验
-
编写一个程序,从 10 开始倒数,然后显示
"Liftoff!"
-
在每个数字后暂停一秒钟,使您的倒计时程序更加逼真。为此,
time
包提供了一个名为Sleep
的函数。
package main //<1>
import "fmt" //<2>
func main() { //<3> fmt.Println("Hello, playground") //<4> }
提示:
使用新包时,如
time
,必须将其列为
import
。 Go Playground 可以为您做到这一点。确保选中导入复选框,然后单击
格式
按钮。 Go Playground 将确定正在使用哪些包并为您添加它们的导入路径。
与 If 和 Switch 进行比较
票务聚合器需要列出来自多个空间线的票证。对于这个原型,每张票都会有一个随机的空间线,它可以通过使用随机数和
if
语句来生成。
package main //<1>
import "fmt" //<2>
func main() { //<3>
fmt.Println("Hello, playground") //<4>
}
- 生成一个 0-2 的随机数
- 如果随机数等于0
- 否则,如果 num 等于 1
- 或者,如果还有什么
提示:
如果您不小心使用了赋值(
=
),而实际上是等式(
==
),Go 就会报错。
格式化打印
为了很好地格式化票据,
Printf
函数比
Print
或
Println
提供了对输出更多的控制,但首先是一个简单的例子。
package main //<1>
import "fmt" //<2>
func main() { //<3>
fmt.Println("Hello, playground") //<4>
}
Printf
的第一个参数是包含
格式动词
%v
的文本。
%v
被替换为权
weight
变量的
值
,同样也被替换为
age
。
Println
函数会自动移动到下一行,但
Printf
和
Print
不会。每当您想移动到下一行时,请将
\n
放在文本中。
如果指定了多个格式动词,Printf 函数将按顺序替换多个变量:
package main //<1>
import "fmt" //<2>
func main() { //<3>
fmt.Println("Hello, playground") //<4>
}
能够在句子中的任何位置替换变量是很棒的,但
Printf
甚至可以让您自定义值的显示方式。
%4v
动词将值填充为 4 个字符的宽度,对于对齐文本很有用:
package main //<1>
import "fmt" //<2>
func main() { //<3>
fmt.Println("Hello, playground") //<4>
}
-
打印
$ 94
-
打印
$ 100
%v
)。
把它们放在一起:票务生成器
随机数、循环、比较和格式化打印:您拥有生成票证列表所需的一切。下面的程序使用带有漂亮标题的表格格式,使其更加精美。
package main //<1>
import "fmt" //<2>
func main() { //<3>
fmt.Println("Hello, playground") //<4>
}
当您在 Go Playground 中运行
清单 9 时
,输出将如下所示:
package main //<1>
import "fmt" //<2>
func main() { //<3>
fmt.Println("Hello, playground") //<4>
}
实验
添加出发日期列,每张机票随机显示
表 1
中的日期之一。
duration
计算应基于相应的距离。
日期 |
距离(公里) |
2016 年 5 月 22 日 |
75,300,000 |
2018 年 7 月 27 日 |
57,600,000 |
2020 年 10 月 13 日 |
62,100,000 |
概括
本文介绍了一个基本的 Go 程序的结构。从那里开始,您使用带有变量、伪随机数、循环和条件的 Go Playground 构建了一个 spaceline 票生成器。一路上,你:
- 使用标准库将文本和数字打印到屏幕并生成伪随机数。
- 声明常量和变量并为变量赋新值。
- 使用数学表达式计算年龄、体重、持续时间和虚构的票价。
-
熟悉 Go 的
if
、switch
和for
分支和重复语法。 -
在总共 25 个 Go 关键字中使用了 11 个:
package
、import
、func
、const
、var
、for
、if
、else
、switch
、case
和default
。