This commit is contained in:
Unknown
2014-07-07 06:35:15 -04:00
parent 9e274f6fa7
commit 3dec401141
5 changed files with 39 additions and 33 deletions

View File

@@ -9,7 +9,7 @@
## 翻译进度 ## 翻译进度
5.6 [标签与 goto](eBook/05.6.md) 6.1 [介绍](eBook/6.1.md)
## 支持本书 ## 支持本书

View File

@@ -1,24 +1,9 @@
## 啊哦,亲,你看得也太快了。。。还没翻译完呢 0 0
要不等到 **2014 年 6 月 30 日** 再来看看吧~~
这里还有一些其它的学习资源噢~
- [《Go编程基础》](https://github.com/Unknwon/go-fundamental-programming)
- [《Go Web编程》](https://github.com/astaxie/build-web-application-with-golang)
- [《Go名库讲解》](https://github.com/Unknwon/go-rock-libraries-showcases)
神马?你说你不想学习?那好吧,去逛逛看看行情也行~
- [Go Walker](https://gowalker.org) **Go 项目 API 文档在线浏览工具**
- [Go 中国社区](http://bbs.go-china.org)
- [Go语言学习园地](http://studygolang.com/)
- [Golang中国](http://golangtc.com)
# 6.0 函数 # 6.0 函数
函数是 Go 里面的基本代码块Go 函数的功能非常强大,以至于被认为拥有函数式编程语言的多种特性。在这一章,我们将对[第 4.2.2 节](04.2.md)所简要描述的函数进行详细的讲解。 函数是 Go 里面的基本代码块Go 函数的功能非常强大,以至于被认为拥有函数式编程语言的多种特性。在这一章,我们将对[第 4.2.2 节](04.2.md)所简要描述的函数进行详细的讲解。
## 链接 ## 链接
- [目录](directory.md) - [目录](directory.md)
- 上一[break与continue使用标签跳转——goto关键字](05.6.md) - 上一[标签与 goto](05.6.md)
- 下一节:[函数介绍](06.1.md) - 下一节:[介绍](06.1.md)

View File

@@ -1,4 +1,5 @@
#6.1 函数介绍 # 6.1 介绍
每一个程序都包含很多的函数:函数是基本的代码块。 每一个程序都包含很多的函数:函数是基本的代码块。
Go是编译型语言所以函数编写的顺序是无关紧要的鉴于可读性的需求最好把 main() 函数写在文件的前面,其他函数按照一定逻辑顺序进行编写(例如函数被调用的顺序)。 Go是编译型语言所以函数编写的顺序是无关紧要的鉴于可读性的需求最好把 main() 函数写在文件的前面,其他函数按照一定逻辑顺序进行编写(例如函数被调用的顺序)。
@@ -7,13 +8,13 @@ Go是编译型语言所以函数编写的顺序是无关紧要的鉴于可
事实上好的程序是非常注意DRY原则的即不要重复你自己Don't Repeat Yourself意思是执行特定任务的代码只能在程序里面出现一次。 事实上好的程序是非常注意DRY原则的即不要重复你自己Don't Repeat Yourself意思是执行特定任务的代码只能在程序里面出现一次。
当函数执行到代码块最后一行(`}`之前)或者`return`语句的时候会退出,其中`return`语句可以带有零个或多个参数;这些参数将作为返回值(参考[6.2节](06.2.md))供调用者使用。简单的`return`语句也可以用来结束for死循环或者结束一个协程goroutine 当函数执行到代码块最后一行(`}`之前)或者`return`语句的时候会退出,其中`return`语句可以带有零个或多个参数;这些参数将作为返回值(参考[6.2 ](06.2.md))供调用者使用。简单的 `return `语句也可以用来结束 for 死循环或者结束一个协程goroutine
Go 里面拥三种类型的函数: Go 里面拥三种类型的函数:
- 普通的带有名字的函数 - 普通的带有名字的函数
- 匿名函数或者lambda函数参考[6.8节](06.8.md) - 匿名函数或者lambda函数参考[6.8 ](06.8.md)
- 方法Methods参考[10.6节](10.6.md) - 方法Methods参考[10.6 ](10.6.md)
所有类型的函数都可以有参数与返回值。函数参数、返回值以及它们的类型被统称为函数签名。 所有类型的函数都可以有参数与返回值。函数参数、返回值以及它们的类型被统称为函数签名。
@@ -34,7 +35,7 @@ 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。函数能多次调用其他函数这些被调用函数按顺序简单而言执行理论上函数调用其他函数的次数是无穷的直到函数调用栈被耗尽
一个简单的函数调用其他函数的例子: 一个简单的函数调用其他函数的例子:
@@ -66,7 +67,7 @@ Function是pack1包里面的一个函数括号里的是被调用函数的*实
funcName redeclared in this book, previous declaration at lineno funcName redeclared in this book, previous declaration at lineno
Go语言不支持这项特性的主要原因是函数重载需要进行多余的类型匹配影响性能没有重载意味着只是一个简单的函数调度。所以你需要给不同的函数使用不同的名字我们通常会根据函数的特征对函数进行命名参考[11.12.5节](11.12.md))。 Go语言不支持这项特性的主要原因是函数重载需要进行多余的类型匹配影响性能没有重载意味着只是一个简单的函数调度。所以你需要给不同的函数使用不同的名字我们通常会根据函数的特征对函数进行命名参考[11.12.5 ](11.12.md))。
如果需要申明一个在外部定义的函数,你只需要给出函数名与函数签名,不需要给出函数体: 如果需要申明一个在外部定义的函数,你只需要给出函数名与函数签名,不需要给出函数体:
@@ -82,11 +83,12 @@ Go语言不支持这项特性的主要原因是函数重载需要进行多余的
这个变量知道自己指向的函数的签名,所以给它赋一个具有不同签名的函数值是不可能的。 这个变量知道自己指向的函数的签名,所以给它赋一个具有不同签名的函数值是不可能的。
函数值functions value之间可以相互比较如果它们引用的是相同的函数或者都是nil的话则认为它们是相同的函数。函数不能在其它函数里面声明不能嵌套不过我们可以通过使用匿名函数参考[6.8节](06.8.md))来破除这个限制。 函数值functions value之间可以相互比较如果它们引用的是相同的函数或者都是nil的话则认为它们是相同的函数。函数不能在其它函数里面声明不能嵌套不过我们可以通过使用匿名函数参考[6.8 ](06.8.md))来破除这个限制。
目前Go没有泛型generic的概念也就是说它不支持那种支持多种类型的函数。不过在大部分情况下可以通过接口interface特别是空接口与类型选择type switch参考[11.12节](11.12.md))与/或者通过使用反射reflection参考[6.8节](06.8.md))来实现相似的功能。使用这些技术将导致代码更为复杂、性能更为地下,所以在非常注意性能的的场合,最好是为每一个类型单独创建一个函数,而且代码可读性更强。 目前Go没有泛型generic的概念也就是说它不支持那种支持多种类型的函数。不过在大部分情况下可以通过接口interface特别是空接口与类型选择type switch参考[11.12 ](11.12.md))与/或者通过使用反射reflection参考[6.8 ](06.8.md))来实现相似的功能。使用这些技术将导致代码更为复杂、性能更为地下,所以在非常注意性能的的场合,最好是为每一个类型单独创建一个函数,而且代码可读性更强。
## 链接 ## 链接
- [目录](directory.md) - [目录](directory.md)
- 上一节:[函数](06.0.md) - 上一节:[函数function](06.0.md)
- 下一节:[函数参数与返回值](06.2.md) - 下一节:[参数与返回值](06.2.md)

View File

@@ -1,3 +1,20 @@
## 啊哦,亲,你看得也太快了。。。还没翻译完呢 0 0
要不等到 **2014 年 7 月 9 日** 再来看看吧~~
这里还有一些其它的学习资源噢~
- [《Go编程基础》](https://github.com/Unknwon/go-fundamental-programming)
- [《Go Web编程》](https://github.com/astaxie/build-web-application-with-golang)
- [《Go名库讲解》](https://github.com/Unknwon/go-rock-libraries-showcases)
神马?你说你不想学习?那好吧,去逛逛看看行情也行~
- [Go Walker](https://gowalker.org) **Go 项目 API 文档在线浏览工具**
- [Go 中国社区](http://bbs.go-china.org)
- [Go语言学习园地](http://studygolang.com/)
- [Golang中国](http://golangtc.com)
#6.2 函数参数与返回值 #6.2 函数参数与返回值
函数能够接收参数供自己使用也可以返回零个或多个值我们通常把返回多个值称为返回一组值。相比与C、C++、Java和C#多值返回是Go的一大特性为我们判断一个函数是否正常执行参考[5.2节](05.2.md))提供了方便。 函数能够接收参数供自己使用也可以返回零个或多个值我们通常把返回多个值称为返回一组值。相比与C、C++、Java和C#多值返回是Go的一大特性为我们判断一个函数是否正常执行参考[5.2节](05.2.md))提供了方便。

View File

@@ -46,6 +46,8 @@
- 5.5 [Break 与 continue](05.5.md) - 5.5 [Break 与 continue](05.5.md)
- 5.6 [标签与 goto](05.6.md) - 5.6 [标签与 goto](05.6.md)
- 第6章[函数function](06.0.md) - 第6章[函数function](06.0.md)
- 6.1 [介绍](06.1.md)
- 6.2 [参数与返回值](06.2.md)
- 第7章数组array与切片slice - 第7章数组array与切片slice
- 第8章Maps - 第8章Maps
- 第9章package - 第9章package