准备好,准备好,出发

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡/ 赠书活动

目前,正在 星球 内带小伙伴们做第一个项目:全栈前后端分离博客项目,采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 204 小节,累计 32w+ 字,讲解图:1416 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 870+ 小伙伴加入,欢迎点击围观

以下文章摘自 Learn Go ,可从 Manning Publications 获取。

介绍围棋游乐场

开始使用 Go 的最快方法是导航到 play.golang.org 。 Go Playground 使您能够编辑、运行和试验 Go,而无需安装任何东西。当您点击 运行 按钮时,Playground 将在 Google 服务器上编译和执行您的代码并显示结果。

图 1 围棋游乐场

Go Playground 确实有一些限制。例如,您可以保存工作的唯一方法是单击 “共享” 按钮并保留书签列表。大多数 gophers 更喜欢使用文本编辑器和在他们自己的计算机上运行的命令行,但您可以只使用 Web 浏览器来熟悉 Go。

包和功能

当您访问 Go Playground 时,您将看到以下代码,这是一个很好的起点。

清单 1 你好,游乐场:playground.go


 package main //<1>

import "fmt" //<2>

func main() { //<3> fmt.Println("Hello, playground") //<4> }


  1. 声明以下代码所属的包
  2. 使 fmt (格式)包可供使用
  3. 声明一个名为 main 的函数
  4. 在屏幕上打印 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 中键入并运行它。

清单 2 Hello Mars:mars.go


 package main //<1>

import "fmt" //<2>

func main() { //<3> fmt.Println("Hello, playground") //<4> }


  1. 给人类读者的评论
  2. 打印 79.443
  3. 打印 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 ,分别用于声明常量和变量。

清单 3 以光速旅行:travel.go


 package main //<1>

import "fmt" //<2>

func main() { //<3> fmt.Println("Hello, playground") //<4> }


  1. 打印 186 秒
  2. 打印 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 之间的两个随机数。

清单 4 随机数:rand.go


 package main //<1>

import "fmt" //<2>

func main() { //<3> fmt.Println("Hello, playground") //<4> }


  1. 导入带括号的多个包
  2. math/rand 是 rand 包的导入路径

注意: 每次运行该程序时,都会显示相同的两个伪随机数。时间在 Go Playground 中停止,结果被缓存,但这些数字足以满足我们的目的。

实验

在接下来的几年里,想象一些宇宙飞船能够以 30 公里/秒的速度行驶,但速度较慢的飞船仍在服役。编写一个程序,生成 16-30 之间的随机速度。

重复 for 循环

清单 4 中多次键入相同的代码不同,Go 提供了 for 关键字来重复相同的代码。一个 for 循环可用于生成 10 个随机数。稍后,将使用 for 循环生成 10 张随机票。

清单 5 循环它:loop.go


 package main //<1>

import "fmt" //<2>

func main() { //<3> fmt.Println("Hello, playground") //<4> }


  1. 在计数小于 10 时重复 {} 之间的代码
  2. 增加计数,否则会一直循环下去

实验

  • 编写一个程序,从 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 语句来生成。

清单 6 比较数字:if.go


 package main //<1>

import "fmt" //<2>

func main() { //<3> fmt.Println("Hello, playground") //<4> }


  1. 生成一个 0-2 的随机数
  2. 如果随机数等于0
  3. 否则,如果 num 等于 1
  4. 或者,如果还有什么

提示: 如果您不小心使用了赋值( = ),而实际上是等式( == ),Go 就会报错。

实验

在 Go Playground 中输入 清单 6 时,请注意大括号 {} 必须如图所示放置。

  • 修改 num 的声明以使用值 0、1 或 2 而不是随机数对其进行初始化。
  • 通过将 清单 6 清单 5 中的循环结合起来生成 10 条随机空间线。

当比较相同的值是否相等时,Go 提供了稍微简洁的 switch 语句。下面的代码可以替换 清单 6 中的 main 函数体。

清单 7 switch 语句:switch.go


 package main //<1>

import "fmt" //<2>

func main() { //<3> fmt.Println("Hello, playground") //<4> }

实验

在 Go Playground 的 main 函数的主体中键入 清单 7 。确保像 清单 6 一样导入 fmt math/rand

  • 用额外的空间线扩展案例陈述,无论是真实的还是虚构的。请务必使用空间线总数更新对 Intn 的调用。
  • case 关键字可以评估逗号分隔的值列表。您可以使用此功能在选定的空间线上放置更高的权重。例如:

    
     package main //<1>
    

    import "fmt" //<2>

    func main() { //<3> fmt.Println("Hello, playground") //<4> }

格式化打印

为了很好地格式化票据, Printf 函数比 Print Println 提供了对输出更多的控制,但首先是一个简单的例子。

清单 8 Printf:fmt.go


 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> }

  1. 打印 $ 94
  2. 打印 $ 100
提示: 请参阅 在线文档 了解其他格式动词(如 %v )。

把它们放在一起:票务生成器

随机数、循环、比较和格式化打印:您拥有生成票证列表所需的一切。下面的程序使用带有漂亮标题的表格格式,使其更加精美。

清单 9 门票:tickets.go


 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 计算应基于相应的距离。

表1 地球到火星的距离

日期

距离(公里)

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