精校:6.0-6.1

This commit is contained in:
Unknwon
2015-07-20 13:26:20 +08:00
parent 868c0009e7
commit c6488b0000
2 changed files with 48 additions and 36 deletions

View File

@@ -2,7 +2,7 @@
每一个程序都包含很多的函数:函数是基本的代码块。
Go是编译型语言所以函数编写的顺序是无关紧要的鉴于可读性的需求最好把 main() 函数写在文件的前面,其他函数按照一定逻辑顺序进行编写(例如函数被调用的顺序)。
Go是编译型语言所以函数编写的顺序是无关紧要的鉴于可读性的需求最好把 `main()` 函数写在文件的前面,其他函数按照一定逻辑顺序进行编写(例如函数被调用的顺序)。
编写多个函数的主要目的是将一个需要很多行代码的复杂问题分解为一系列简单的任务(那就是函数)来解决。而且,同一个任务(函数)可以被调用多次,有助于代码重用。
@@ -22,25 +22,32 @@ Go 里面拥三种类型的函数:
这样是不正确的 Go 代码:
```go
func g()
{
}
```
它必须是这样的:
```go
func g() {
}
```
函数被调用的基本格式如下:
```go
pack1.Function(arg1, arg2, , argn)
```
Functionpack1包里面的一个函数括号里的是被调用函数的*实参*argument这些值被传递给被调用函数的*形参*parameter参考[第 6.2 节](06.2.md)。函数被调用的时候这些实参将被复制简单而言然后传递给被调用函数。函数一般是在其他函数里面被调用的这个其他函数被称为调用函数calling function。函数能多次调用其他函数这些被调用函数按顺序简单而言执行理论上函数调用其他函数的次数是无穷的直到函数调用栈被耗尽
`Function``pack1` 包里面的一个函数括号里的是被调用函数的实参argument这些值被传递给被调用函数的*形参*parameter参考 [第 6.2 节](06.2.md)。函数被调用的时候这些实参将被复制简单而言然后传递给被调用函数。函数一般是在其他函数里面被调用的这个其他函数被称为调用函数calling function。函数能多次调用其他函数这些被调用函数按顺序简单而言执行理论上函数调用其他函数的次数是无穷的直到函数调用栈被耗尽
一个简单的函数调用其他函数的例子:
示例 6.1 [greeting.go](examples/chapter_6/greeting.go)
```go
package main
func main() {
@@ -52,6 +59,7 @@ Function是pack1包里面的一个函数括号里的是被调用函数的*实
func greeting() {
println("In greeting: Hi!!!!!")
}
```
代码输出:
@@ -61,7 +69,7 @@ Function是pack1包里面的一个函数括号里的是被调用函数的*实
函数可以将其他函数调用作为它的参数,只要这个被调用函数的返回值个数、返回值类型和返回值的顺序与调用函数所需求的实参是一致的,例如:
假设 f1 需要3个参数 `f1(a, b, c int)`,同时 f2 返回3个参数 `f2(a, b int) (int, int, int)`,就可以这样调用 f1`f1(f2(a, b))`
假设 f1 需要 3 个参数 `f1(a, b, c int)`,同时 f2 返回 3 个参数 `f2(a, b int) (int, int, int)`,就可以这样调用 f1`f1(f2(a, b))`
函数重载function overloading指的是可以编写多个同名函数只要它们拥有不同的形参与/或者不同的返回值,在 Go 里面函数重载是不被允许的。这将导致一个编译错误:
@@ -71,11 +79,15 @@ Go语言不支持这项特性的主要原因是函数重载需要进行多余的
如果需要申明一个在外部定义的函数,你只需要给出函数名与函数签名,不需要给出函数体:
```go
func flushICache(begin, end uintptr) // implemented externally
```
**函数也可以以申明的方式被使用,作为一个函数类型**,就像:
```go
type binOp func(int, int) int
```
在这里,不需要函数体 `{}`