Go 的变量与常量
代码清单 2-1 你好,火星: mars.go
// My weight loss program. // 为人类读者提供的注释 package main import "fmt" // main is the function where it all begins. // 为人类读者提供的注释 func main() { fmt.Print("My weight on the surface of Mars is ") fmt.Print(149.0 * 0.3783) // 打印出 56.3667 fmt.Print(" lbs, and I would be ") fmt.Print(41 * 365 / 687) // 打印出 21 fmt.Print(" years old.") }
代码清单 2-1 中的计数器在计算时使用了类似 0.3783 这样的 字面 数字,但并没有具体说明这些数字所代表的的含义,程序员有时候会把这种没有说明具体含义的字面数字称之为 魔数 。 通过使用常量和变量并为字面数字赋予描述性的名称,我们可以有效地减少魔数的存在。
在了解过居住在火星对于年龄和体重有何种好处之后,我们接下来要考虑的就是旅行所需消耗的时长。 对于我们的旅程来说,光速旅行是最为理想的。 因为光在太空的真空环境中会以 固定 速度传播,所以相应的计算将会变得较为简单。 与此相反的是,根据行星在太阳轨道上所处的位置不同,地球和火星之间的距离将会产生相当大的 变化 。
代码清单 2-3 引入了两个新的关键字 const
和 var
,它们分别用于声明常量和变量。
代码清单 2-3 实现光速旅行: lightspeed.go
// How long does it take to get to Mars? package main import "fmt" func main() { const lightSpeed = 299792 // km/s var distance = 56000000 // km fmt.Println(distance/lightSpeed, "seconds") // 打印出“186 seconds” distance = 401000000 fmt.Println(distance/lightSpeed, "seconds") // 打印出“1337 seconds” }
只要将代码清单 2-3 中的代码输入至 Go 游乐场然后点击运行按钮,我们就可以计算出从地球出发到火星所需的时间了。 能够以光速前进是一件非常便捷的事情,不消一会儿工夫你就到达了目的地,你甚至都不会听到有人抱怨说“我们怎么还没到?”。
这段代码的第一次计算通过声明 distance
变量并为其赋予初始值 56,000,000 公里来模拟火星与地球相邻时的情形,而在进行第二次计算的时候,则通过为 distance
变量赋予新值 401,000,000 公里来模拟火星和地球分列太阳两侧时的情形(其中 401,000,000 公里代表的是火星和地球之间的直线距离)。
{注意}
lightSpeed
常量是不能被修改的, 尝试为其赋予新值将导致 Go 编译器报告错误:“无法对 lightSpeed
进行赋值”。
{注意}
变量必须先声明后使用。 如果变量尚未使用 var
关键字进行声明, 那么尝试向它赋值将导致 Go 报告错误, 比如在前面的代码中执行 speed = 16
就会这样。 这一限制有助于发现类似“想要向 distance
赋值结果却键入了 distence
”这样的问题。
{速查 2-3}
-
尽管 SpaceX 公司的星际运输系统因为缺少曲速引擎而无法以光速行进, 但它仍然能够以每小时 100,800 公里这一可观的速度驶向火星。 如果这个雄心勃勃的公司在 2025 年的一月份, 也即是地球和火星之间相距 96,300,000 公里远的时候发射宇宙飞船, 那么它需要用多少天才能够到达火星? 请修改代码清单 2-3 来计算并回答这一问题。
-
在地球上, 一天总共有 24 个小时。 如果要在程序中为数字 24 指定一个描述性的名字, 你会用什么关键字?
{速查 2-3 答案}
-
虽然宇宙飞船在实际中不可能只沿着直线行进, 但作为一个粗略的估计, 它从地球飞行至火星大约需要用 39 天。 以下是进行计算所需修改的代码:
const hoursPerDay = 24 var speed = 100800 // 公里/小时 var distance = 96300000 // 公里 fmt.Println(distance/speed/hoursPerDay, "days")
-
因为地球一天拥有的小时数不太可能在程序运行的过程中发生变化, 所以我们可以使用
const
关键字来定义它。