Merge pull request #7 from hongruiqi/master

2.3 review
This commit is contained in:
astaxie
2012-08-28 06:36:24 -07:00

15
2.3.md
View File

@@ -56,7 +56,7 @@ go里面最强大的一个控制逻辑就是for他即可以用来循环读取
...
}
expression1、expression2、expression3都是表达式其中expression1和expression3是变量申明或者函数调用返回值之类的expression2是条件判断expression1在循环开始之前调用expression3在循环结束之调用
expression1、expression2、expression3都是表达式其中expression1和expression3是变量申明或者函数调用返回值之类的expression2是条件判断expression1在循环开始之前调用expression3在每轮循环结束之调用
一个例子比上面讲那么多更有用,那么我们看看下面的例子吧
@@ -107,7 +107,7 @@ for可以用于读取slice和map的数据配合range
for k,v:=range map {
fmt.Println("map's key:",k)
fmt.Println("map's val:",v)
}
}
其中还可以使用`_`来扔掉不需要的返回值
@@ -186,7 +186,7 @@ sExpr和expr1、expr2、expr3的类型必须一致。Go的switch非常灵活。
- 函数可以有一个或者多个参数,每个参数后面带有类型,通过`,`分隔
- 函数可以返回多个值
- 上面返回值申明了两个变量output1和output2如果你不想申明也可以直接就两个类型
- 如果只有一个返回值,那么你可以省略用以包括返回值的括号
- 如果只有一个返回值且不申明返回值变量,那么你可以省略用以包括返回值的括号
- 如果没有返回值,那么就直接省略最后的返回信息
下面我们来看一个实际应用函数的例子(用来计算Max值)
@@ -314,10 +314,11 @@ arg ... int 告诉Go这个函数接受不定数量的参数。注意这些参
这样我们就真的实现了修改x的目的。那么到底传引用有什么好处呢
- 传引用使得多个函数能同时操作同一个变量。
-用比较轻量级只是传内存地址这使得我们函数可以处理大数据量的值如果传值的话那么每次调用函数花费在copy上面就会花费大量的内存。所以记住了当你要操作大数据量的时候用引用是一个明智的选择。
-用比较轻量级只是传内存地址这使得我们函数可以处理大数据量的值如果传值的话那么每次调用函数花费在copy上面就会花费大量的内存。所以记住了当你要操作大数据量的时候用引用是一个明智的选择。
- GO语言中stringslicemap这三种类型的实现机制类似引用所以可以直接传递而不用取地址后传递指针。若函数会改变slice的长度则仍需要取地址传递指针
###defer
Go里面有一个不错的设计就是回调函数有点类似面向对象语言里面的析构函数当函数执行完之后再执行。特别是当你处理一些打开资源操作时遇到错误提前返回那么你需要关闭相应的资源不然很容易造成内存泄露等问题。如下代码所示,我们一般写打开一个资源是这样操作的:
Go里面有一个不错的设计就是回调函数有点类似面向对象语言里面的析构函数当函数执行完之后再执行。特别是当你处理一些打开资源操作时遇到错误提前返回那么你需要关闭相应的资源不然很容易造成资源泄露等问题。如下代码所示,我们一般写打开一个资源是这样操作的:
func ReadWrite() bool {
file.Open("file")
@@ -357,7 +358,7 @@ Go里面有一个不错的设计就是回调函数有点类似面向对象
}
###函数作为值、类型
我们可以通过类型来操作,他的类型就是所有拥有相同的参数,相同的返回值一种类型
我们可以通过类型来操作,他的类型就是所有拥有相同的参数,相同的返回值一种类型
type type_name func(input1 inputType1 [, input2 inputType2 [, ...]) (result1 resultType1 [, ...])
函数作为类型到底有什么好处呢?那就是可以把这个类型的函数当做值来传递,请看下面的例子
@@ -401,7 +402,7 @@ Go里面有一个不错的设计就是回调函数有点类似面向对象
fmt.Println("Even elements of slice are: ", even)
}
函数当做值和类型在我们写一些通用接口的时候非常有用通过上面例子我们看到test_int这个类型是一个函数然后这个函数参数和返回值是一样的,但是我们可以实现很多种的逻辑,这样使得我们的程序变得非常的灵活。
函数当做值和类型在我们写一些通用接口的时候非常有用通过上面例子我们看到test_int这个类型是一个函数类型,然后两个filter函数参数和返回值与test_int类型是一样的,但是我们可以实现很多种的逻辑,这样使得我们的程序变得非常的灵活。
###Panic和Recover