2016-02-15 03:06:34 +00:00
|
|
|
|
## 2.2. 声明
|
2015-12-09 07:45:11 +00:00
|
|
|
|
|
2016-02-15 03:06:34 +00:00
|
|
|
|
声明语句定义了程序的各种实体对象以及部分或全部的属性。Go语言主要有四种类型的声明语句:var、const、type和func,分别对应变量、常量、类型和函数实体对象的声明。这一章我们重点讨论变量和类型的声明,第三章将讨论常量的声明,第五章将讨论函数的声明。
|
2015-12-09 07:45:11 +00:00
|
|
|
|
|
2016-02-15 03:06:34 +00:00
|
|
|
|
一个Go语言编写的程序对应一个或多个以.go为文件后缀名的源文件中。每个源文件以包的声明语句开始,说明该源文件是属于哪个包。包声明语句之后是import语句导入依赖的其它包,然后是包一级的类型、变量、常量、函数的声明语句,包一级的各种类型的声明语句的顺序无关紧要(译注:函数内部的名字则必须先声明之后才能使用)。例如,下面的例子中声明了一个常量、一个函数和两个变量:
|
2015-12-09 07:45:11 +00:00
|
|
|
|
|
2016-01-20 15:16:19 +00:00
|
|
|
|
<u><i>gopl.io/ch2/boiling</i></u>
|
2015-12-09 07:45:11 +00:00
|
|
|
|
```Go
|
|
|
|
|
// 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
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
2016-02-15 03:06:34 +00:00
|
|
|
|
其中常量boilingF是在包一级范围声明语句声明的,然后f和c两个变量是在main函数内部声明的声明语句声明的。在包一级声明语句声明的名字可在整个包对应的每个源文件中访问,而不是仅仅在其声明语句所在的源文件中访问。相比之下,局部声明的名字就只能在函数内部很小的范围被访问。
|
2015-12-09 07:45:11 +00:00
|
|
|
|
|
2016-04-04 09:38:28 +00:00
|
|
|
|
一个函数的声明由一个函数名字、参数列表(由函数的调用者提供参数变量的具体值)、一个可选的返回值列表和包含函数定义的函数体组成。如果函数没有返回值,那么返回值列表是省略的。执行函数从函数的第一个语句开始,依次顺序执行直到遇到return返回语句,如果没有返回语句则是执行到函数末尾,然后返回到函数调用者。
|
2015-12-09 07:45:11 +00:00
|
|
|
|
|
2016-02-15 03:06:34 +00:00
|
|
|
|
我们已经看到过很多函数声明和函数调用的例子了,在第五章将深入讨论函数的相关细节,这里只简单解释下。下面的fToC函数封装了温度转换的处理逻辑,这样它只需要被定义一次,就可以在多个地方多次被使用。在这个例子中,main函数就调用了两次fToC函数,分别是使用在局部定义的两个常量作为调用函数的参数。
|
2015-12-09 07:45:11 +00:00
|
|
|
|
|
2016-01-20 15:16:19 +00:00
|
|
|
|
<u><i>gopl.io/ch2/ftoc</i></u>
|
2015-12-09 07:45:11 +00:00
|
|
|
|
```Go
|
|
|
|
|
// 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
|
|
|
|
|
}
|
|
|
|
|
```
|