准备好,准备好,出发

更新时间:

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

欢迎加入小哈的星球 ,你将获得:专属的项目实战(已更新的所有项目都能学习) / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新开坑项目:《Spring AI 项目实战》 正在持续爆肝中,基于 Spring AI + Spring Boot 3.x + JDK 21..., 点击查看 ;
  • 《从零手撸:仿小红书(微服务架构)》 已完结,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...,点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 100w+ 字,讲解图 4013+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3700+ 小伙伴加入学习 ,欢迎点击围观

以下文章摘自 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 。

最新发布