This commit is contained in:
Unknown
2014-04-09 00:04:59 -04:00
parent f66ca15956
commit 480ec9f46a
10 changed files with 114 additions and 62 deletions

View File

@@ -1,4 +1,5 @@
#4.2 Go 程序的基本结构和要素
# 4.2 Go 程序的基本结构和要素
Example 4.1 [hello_world.go](examples/chapter_4/hello_world.go)
package main
@@ -9,7 +10,8 @@ Example 4.1 [hello_world.go](examples/chapter_4/hello_world.go)
fmt.Println("hello, world")
}
##4.2.1 包的概念、导入与可见性
## 4.2.1 包的概念、导入与可见性
包是结构化代码的一种方式:每个程序都由包(通常简称为 pkg的概念组成可以使用自身的包或者从其它包中导入内容。
如同其它一些编程语言中的类库或命名空间的概念,每个 Go 文件都属于且仅属于一个包。一个包可以由许多以 `.go` 为扩展名的源文件组成,因此文件名和包名一般来说都是不相同的。
@@ -52,7 +54,7 @@ Go 中的包模型采用了显式依赖关系的机制来达到快速编译的
或:
import fmt; import os
import "fmt"; import "os"
但是还有更短且更优雅的方法(被称为因式分解关键字,该方法同样适用于 const、var 和 type 的声明或定义):
@@ -102,7 +104,8 @@ Example 4.2 [alias.go](examples/chapter_4/alias.go)
你可以在使用 `import` 导入包之后定义或声明 0 个或多个常量const、变量var和类型type这些对象的作用域都是全局的在本包范围内所以可以被本包中所有的函数调用如 [gotemplate.go](examples/chapter_4/gotemplate.go) 源文件中的 c 和 v然后声明一个或多个函数func
##4.2.2 函数
## 4.2.2 函数
这是定义一个函数最简单的格式:`func functionName()`
你可以在括号 `()` 中写入 0 个或多个函数的参数(使用逗号 `,` 分隔),每个参数的名称后面必须紧跟着该参数的类型。
@@ -151,7 +154,8 @@ main 函数是每一个可执行程序所必须包含的,一般来说都是在
程序正常退出的代码为 0 `Program exited with code 0`如果程序因为异常而被终止则会返回非零值1。这个数值可以用来测试是否成功执行一个程序。
##4.2.3 注释
## 4.2.3 注释
Example 4.2 [hello_world2.go](examples/chapter_4/hello_world2.go)
package main
@@ -188,7 +192,8 @@ Example 4.2 [hello_world2.go](examples/chapter_4/hello_world2.go)
godoc 工具(第 3.6 节)会收集这些注释并产生一个技术文档。
##4.2.4 类型
## 4.2.4 类型
可以包含数据的变量(或常量)可以使用不同的数据类型或类型来保存数据。使用 var 声明的变量的值会自动初始化为该类型的零值。类型定义了某个变量的值的集合与可对其进行操作的集合。
类型可以是基本类型intfloatboolstring结构化的复合的structarrayslicemapchannel只描述类型的行为的interface。
@@ -215,7 +220,7 @@ godoc 工具(第 3.6 节)会收集这些注释并产生一个技术文档。
type IZ int
***译者注:这里并不是真正意义上的别名,因为使用这种方法定义之后的类型可以拥有更多的特性,且在类型转换时必须显式转换***
**译者注:这里并不是真正意义上的别名,因为使用这种方法定义之后的类型可以拥有更多的特性,且在类型转换时必须显式转换**
然后我们可以像 `var a IZ = 5` 这样声明变量。
@@ -231,7 +236,8 @@ godoc 工具(第 3.6 节)会收集这些注释并产生一个技术文档。
每个值都必须在经过编译后属于某个类型(编译器必须能够推断出所有值的类型),因为 Go 语言是一种静态类型语言。
##4.2.5 Go 程序的一般结构
## 4.2.5 Go 程序的一般结构
下面的程序可以被顺利编译但什么都做不了,不过这很好地展示了一个 Go 程序的首选结构。这种结构并没有被强制要求,编译器也不关心 main 函数在前还是变量的声明在前,但使用统一的结构能够在从上至下阅读 Go 代码时有更好的体验。
所有的结构将在这一章或接下来的章节中进一步地解释说明,但总体思路如下:
@@ -272,12 +278,13 @@ Go 程序的执行(程序启动)顺序如下:
3. 然后以相反的顺序在每个包中初始化常量和变量,如果该包含有 init 函数的话,则调用该函数。
4. 在完成这一切之后main 也执行同样的过程,最后调用 main 函数开始执行程序。
##4.2.6 类型转换
## 4.2.6 类型转换
在必要以及可行的情况下,一个类型的值可以被转换成另一种类型的值。由于 Go 语言不存在隐式类型转换,因此所有的转换都必须显式说明,就像调用一个函数一样(类型在这里的作用可以看作是一种函数):
valueOfTypeB = typeB(valueOfTypeA)
***译者注:类型B的值 = 类型B(类型A的值)***
**译者注:类型 B 的值 = 类型 B(类型 A 的值)**
示例:
@@ -292,10 +299,12 @@ Go 程序的执行(程序启动)顺序如下:
c := int(a)
d := IZ(c)
##4.2.7 Go 命名规范
干净、可读的代码和简洁性是 Go 追求的主要目标。通过 gofmt 来强制实现统一的代码风格。Go 语言中对象的命名也应该是简洁且有意义的。像 Java 和 Python 中那样使用混合着大小写和下划线的冗长的名称会严重降低代码的可读性。名称不需要指出自己所属的包,因为在调用的时候会使用包名作为限定符。返回某个对象的函数或方法的名称一般都是使用名词,没有 “Get...” 之类的字符( ***译者注:个人觉得这个有点牵强*** ),如果是用于修改某个对象,则使用 “SetName”。有必须要的话可以使用大小写混合的方式如 MixedCaps 或 mixedCaps而不是使用下划线来分割多个名称。
## 4.2.7 Go 命名规范
干净、可读的代码和简洁性是 Go 追求的主要目标。通过 gofmt 来强制实现统一的代码风格。Go 语言中对象的命名也应该是简洁且有意义的。像 Java 和 Python 中那样使用混合着大小写和下划线的冗长的名称会严重降低代码的可读性。名称不需要指出自己所属的包,因为在调用的时候会使用包名作为限定符。返回某个对象的函数或方法的名称一般都是使用名词,没有 “Get...” 之类的字符( **译者注:个人觉得这个有点牵强** ),如果是用于修改某个对象,则使用 “SetName”。有必须要的话可以使用大小写混合的方式如 MixedCaps 或 mixedCaps而不是使用下划线来分割多个名称。
## 链接
##链接
- [目录](directory.md)
- 上一节:[文件名、关键字与标识符](04.1.md)
- 下一节:[常量](04.3.md)