fixed markdown format

This commit is contained in:
yetist
2012-10-28 21:00:50 +08:00
parent c3abc9b6c7
commit 81a61b9ced
59 changed files with 280 additions and 280 deletions

28
2.3.md
View File

@@ -1,8 +1,8 @@
#2.3 流程和函数
# 2.3 流程和函数
这小节我们要介绍Go里面的流程控制以及函数操作
##流程控制
## 流程控制
流程控制在编程语言中是最伟大的发明了,因为有了它,你可以通过很简单的描述来表达很复杂的事情。
###if
### if
`if`也许是所有语言中最常见的了,它的语法概括起来就是:`如果满足条件就做某事,否则做另一件事`
Go里面`if`条件语法中不需要括号,如下代码所示
@@ -35,7 +35,7 @@ Go的`if`还有一个强大的地方就是条件里面允许声明一个变量
fmt.Println("The integer is greater than 3")
}
###goto
### goto
Go有`goto`语句——请明智地使用它。用`goto`跳转到一定是当前函数内定义的标签。例如假设这样一个循环:
@@ -49,7 +49,7 @@ Go有`goto`语句——请明智地使用它。用`goto`跳转到一定是当前
标签名是大小写敏感的。
###for
### for
Go里面最强大的一个控制逻辑就是`for`,它即可以用来循环读取数据,又可以当作`while`来控制逻辑,还能迭代操作。它的语法如下:
for expression1; expression2; expression3 {
@@ -117,7 +117,7 @@ Go里面最强大的一个控制逻辑就是`for`,它即可以用来循环读
}
###switch
### switch
有些时候你需要写很多的`if-else`来实现一些逻辑处理,这个时候代码看上去就很丑很冗长,而且也不易于以后的维护,这个时候`switch`就能很好的解决这个问题。它的语法如下
switch sExpr {
@@ -176,7 +176,7 @@ Go里面最强大的一个控制逻辑就是`for`,它即可以用来循环读
default case
##函数
## 函数
函数是Go里面的核心设计它通过关键字`func`来声明,它的格式如下:
func funcName(input1 type1, input2 type2) (output1 type1, output2 type2) {
@@ -223,7 +223,7 @@ Go里面最强大的一个控制逻辑就是`for`,它即可以用来循环读
上面这个里面我们可以看到`max`函数有两个参数,它们的类型都是`int`,那么第一个变量的类型可以省略(即 a,b int,而非 a int, b int)默认为离它最近的类型同理多于2个同类型的变量或者返回值。同时我们注意到它的返回值就是一个类型这个就是省略写法。
###多个返回值
### 多个返回值
Go语言和C相比更先进的地方其中一点就是能够返回多个值也许这个思想来源于Python。
我们直接上代码看例子
@@ -254,7 +254,7 @@ Go语言和C相比更先进的地方其中一点就是能够返回多个
return
}
###变参
### 变参
Go函数支持变参。接受变参的函数是有着不定数量的参数的。为了做到这点首先需要定义函数使其接受变参
func myfunc(arg ...int) {}
@@ -264,7 +264,7 @@ Go函数支持变参。接受变参的函数是有着不定数量的参数的。
fmt.Printf("And the number is: %d\n", n)
}
###传值与传指针
### 传值与传指针
当我们传一个参数值到被调用函数里面时实际上是传了这个值的一份copy当在被调用函数中修改参数值的时候调用函数中相应实参不会发生任何变化因为我们作用在了copy上面。
为了验证我们上面的说法,我们来看一个例子
@@ -323,7 +323,7 @@ Go函数支持变参。接受变参的函数是有着不定数量的参数的。
- 传指针比较轻量级 (8 bytes)只是传内存地址,我们可以通过指针高效的传递大的结构体。如果传值的话,那么每次传递, 在copy上面就会花费大量的时间和内存。所以记住了当你要传递大的结构体的时候用指针是一个明智的选择。
- Go语言中`string``slice``map`这三种类型的实现机制类似指针,所以可以直接传递,而不用取地址后传递指针。(注:若函数需改变`slice`的长度,则仍需要取地址传递指针)
###defer
### defer
Go里面有一个不错的设计就是回调函数有点类似面向对象语言里面的析构函数当函数执行完之后再执行。特别是当你在进行一些打开资源的操作时遇到错误需要提前返回在返回前你需要关闭相应的资源不然很容易造成资源泄露等问题。如下代码所示我们一般写打开一个资源是这样操作的
func ReadWrite() bool {
@@ -363,7 +363,7 @@ Go里面有一个不错的设计就是回调函数有点类似面向对象
defer fmt.Printf("%d ", i)
}
###函数作为值、类型
### 函数作为值、类型
在Go中函数也是一种变量我们可以通过`type`来定义它,它的类型就是所有拥有相同的参数,相同的返回值的一种类型
@@ -413,7 +413,7 @@ Go里面有一个不错的设计就是回调函数有点类似面向对象
函数当做值和类型在我们写一些通用接口的时候非常有用,通过上面例子我们看到`testInt`这个类型是一个函数类型,然后两个`filter`函数的参数和返回值与`testInt`类型是一样的,但是我们可以实现很多种的逻辑,这样使得我们的程序变得非常的灵活。
###Panic和Recover
### Panic和Recover
Go没有像Java那样的异常机制它不能抛出异常而是使用了`panic``recover`机制。一定要记住,你应当把它作为最后的手段来使用,也就是说,你的代码中应当没有,或者很少有`panic`的东西。这是个强大的工具,请明智地使用它。那么,我们应该如何使用它呢?
@@ -445,7 +445,7 @@ Recover
return
}
###`main`函数和`init`函数
### `main`函数和`init`函数
Go里面有两个保留的函数`init`函数(能够应用于所有的`package`)和`main`函数(只能应用于`package main`)。这两个函数在定义时不能有任何的参数和返回值。虽然一个`package`里面可以写任意多个`init`函数,但这无论是对于可读性还是以后的可维护性来说,我们都强烈建议用户在一个`package`中只写一个`init`函数。