15
2.3.md
15
2.3.md
@@ -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语言中string,slice,map这三种类型的实现机制类似引用,所以可以直接传递,而不用取地址后传递指针。(注:若函数会改变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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user