2.2. 声明

声明定义了程序的入口以及部分或全部的属性. Go主要有四种声明类型: var, const, type, 和 func, 分别对应 变量, 常量, 类型, 和 函数的 声明. 这一章我们重点讨论变量和类型的声明, 第三章将讨论常量的声明, 第五章将讨论函数的声明.

一个Go程序存储在一个或多个以.go为后缀名的文件中. 每个文件以个包的声明开始, 以说明文件是属于包的一部分. 包声明之后是 import 导入声明, 然后是包一级的类型/变量/常量/函数的声明, 声明的顺序无关紧要. 例如, 下面的例子声明了一个常量, 一个函数和两个变量:

gopl.io/ch2/boiling
// Boiling prints the boiling point of water.
package main

import "fmt"

const boilingF = 212.0

func main() {
    var f = boilingF
    var c = (f - 32) * 5 / 9
    fmt.Printf("boiling point = %g°F or %g°C\n", f, c)
    // Output:
    // boiling point = 212°F or 100°C
}

其中 常量 boilingF 是在包一级声明的, 然后 fc 是在 main 函数内部声明的. 在包一级声明的名字可在整个包访问, 而不仅仅在其声明的文件中访问. 相比之下, 局部声明的名字就只能在函数内部很小的部分可访问.

一个函数的声明有一个函数名字, 参数列表(由函数的调用者提供参数变量的具体值), 一个可选的返回值列表, 和包含函数语句定义的函数体. 如果函数没有返回值, 那么返回值列表是省略的. 执行函数从函数的第一个语句开始, 但是顺序执行直到遇到 renturn 返回语言, 如果没有返回语句则是到函数末尾, 然后返回到调用者.

我们已经看到过很多函数的例子了, 在第五章将深入讨论函数的细节, 这里只粗略说下. 下面的 fToC 函数封装了温度转换的逻辑, 这样它只需要定义一次, 就可以在多个地方多次使用. 这个例子中, main 函数就调用了两次 fToC 函数, 分别是使用局部定义的两个常量作为函数参数.

gopl.io/ch2/ftoc
// Ftoc prints two Fahrenheit-to-Celsius conversions.
package main

import "fmt"

func main() {
    const freezingF, boilingF = 32.0, 212.0
    fmt.Printf("%g°F = %g°C\n", freezingF, fToC(freezingF)) // "32°F = 0°C"
    fmt.Printf("%g°F = %g°C\n", boilingF, fToC(boilingF))   // "212°F = 100°C"
}

func fToC(f float64) float64 {
    return (f - 32) * 5 / 9
}