mirror of
https://github.com/unknwon/the-way-to-go_ZH_CN.git
synced 2025-08-11 22:06:51 +08:00
精校:6.0-6.1
This commit is contained in:
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
每一个程序都包含很多的函数:函数是基本的代码块。
|
每一个程序都包含很多的函数:函数是基本的代码块。
|
||||||
|
|
||||||
Go是编译型语言,所以函数编写的顺序是无关紧要的;鉴于可读性的需求,最好把 main() 函数写在文件的前面,其他函数按照一定逻辑顺序进行编写(例如函数被调用的顺序)。
|
Go是编译型语言,所以函数编写的顺序是无关紧要的;鉴于可读性的需求,最好把 `main()` 函数写在文件的前面,其他函数按照一定逻辑顺序进行编写(例如函数被调用的顺序)。
|
||||||
|
|
||||||
编写多个函数的主要目的是将一个需要很多行代码的复杂问题分解为一系列简单的任务(那就是函数)来解决。而且,同一个任务(函数)可以被调用多次,有助于代码重用。
|
编写多个函数的主要目的是将一个需要很多行代码的复杂问题分解为一系列简单的任务(那就是函数)来解决。而且,同一个任务(函数)可以被调用多次,有助于代码重用。
|
||||||
|
|
||||||
@@ -22,25 +22,32 @@ Go 里面拥三种类型的函数:
|
|||||||
|
|
||||||
这样是不正确的 Go 代码:
|
这样是不正确的 Go 代码:
|
||||||
|
|
||||||
|
```go
|
||||||
func g()
|
func g()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
```
|
||||||
|
|
||||||
它必须是这样的:
|
它必须是这样的:
|
||||||
|
|
||||||
|
```go
|
||||||
func g() {
|
func g() {
|
||||||
}
|
}
|
||||||
|
```
|
||||||
|
|
||||||
函数被调用的基本格式如下:
|
函数被调用的基本格式如下:
|
||||||
|
|
||||||
|
```go
|
||||||
pack1.Function(arg1, arg2, …, argn)
|
pack1.Function(arg1, arg2, …, argn)
|
||||||
|
```
|
||||||
|
|
||||||
Function是pack1包里面的一个函数,括号里的是被调用函数的*实参*(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)
|
示例 6.1 [greeting.go](examples/chapter_6/greeting.go)
|
||||||
|
|
||||||
|
```go
|
||||||
package main
|
package main
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@@ -52,6 +59,7 @@ Function是pack1包里面的一个函数,括号里的是被调用函数的*实
|
|||||||
func greeting() {
|
func greeting() {
|
||||||
println("In greeting: Hi!!!!!")
|
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 里面函数重载是不被允许的。这将导致一个编译错误:
|
函数重载(function overloading)指的是可以编写多个同名函数,只要它们拥有不同的形参与/或者不同的返回值,在 Go 里面函数重载是不被允许的。这将导致一个编译错误:
|
||||||
|
|
||||||
@@ -71,11 +79,15 @@ Go语言不支持这项特性的主要原因是函数重载需要进行多余的
|
|||||||
|
|
||||||
如果需要申明一个在外部定义的函数,你只需要给出函数名与函数签名,不需要给出函数体:
|
如果需要申明一个在外部定义的函数,你只需要给出函数名与函数签名,不需要给出函数体:
|
||||||
|
|
||||||
|
```go
|
||||||
func flushICache(begin, end uintptr) // implemented externally
|
func flushICache(begin, end uintptr) // implemented externally
|
||||||
|
```
|
||||||
|
|
||||||
**函数也可以以申明的方式被使用,作为一个函数类型**,就像:
|
**函数也可以以申明的方式被使用,作为一个函数类型**,就像:
|
||||||
|
|
||||||
|
```go
|
||||||
type binOp func(int, int) int
|
type binOp func(int, int) int
|
||||||
|
```
|
||||||
|
|
||||||
在这里,不需要函数体 `{}`。
|
在这里,不需要函数体 `{}`。
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user