fixed markdown format
This commit is contained in:
28
2.3.md
28
2.3.md
@@ -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`函数。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user