这里要说一下是go函数和一些其他语言不一样的地方
1
2
3
4
5
6
<code>func getmsg(i </code><code>int</code><code>) (r </code><code>string</code><code>) {</code>
<code> </code><code>fmt.println(i)</code>
<code> </code><code>r = </code><code>"hi"</code>
<code> </code><code>return</code> <code>r</code>
<code>}</code>
func说明这个是个函数
getmsg是函数名
(i int) 函数接收一个int参数
(r string) 函数返回一个string类型返回值
这点和c,php都不一样,和lua是一样的
7
<code>func getmsg(i </code><code>int</code><code>) (r </code><code>string</code><code>, err </code><code>string</code><code>) {</code>
<code> </code><code>err = </code><code>"no err"</code>
<code> </code><code>return</code> <code>r,err</code>
defer的意思是"在函数退出时调用",特别用于对文件进行读写操作的时候,需要在open之后要调用close操作,将close操作使用defer
<code>func readfile(filepath</code><code>string</code><code>)(){</code>
<code> </code><code>file.open(filepath)</code>
<code> </code><code>defer file.close()</code>
<code> </code>
<code> </code><code>if</code> <code>true</code> <code>{</code>
<code> </code><code>file.read()</code>
<code> </code><code>}</code><code>else</code> <code>{</code>
<code> </code><code>return</code> <code>false</code>
<code> </code><code>}</code>
这样写的意思是在file.open后不立即调用close,当return false的时候调用file.close().这样就有效避免了c语言中的内存泄露问题。
推荐看这篇博客:
<a href="http://blog.golang.org/2010/08/defer-panic-and-recover.html">http://blog.golang.org/2010/08/defer-panic-and-recover.html</a>
defer的作用上一节说得很清楚了。
panic和recover我们就将他们看成是其他语言中的throw和catch
下面这个例子:
<code>package main</code>
<code>import</code><code>"fmt"</code>
<code>func main() {</code>
<code> </code><code>f()</code>
<code> </code><code>fmt.println(</code><code>"returned normally from f."</code><code>)</code>
<code>func f() {</code>
<code> </code><code>defer func() {</code>
<code> </code><code>if</code> <code>r := recover(); r != nil {</code>
<code> </code><code>fmt.println(</code><code>"recovered in f"</code><code>, r)</code>
<code> </code><code>}</code>
<code> </code><code>}()</code>
<code> </code><code>fmt.println(</code><code>"calling g."</code><code>)</code>
<code> </code><code>g(0)</code>
<code> </code><code>fmt.println(</code><code>"returned normally from g."</code><code>)</code>
<code>func g(i</code><code>int</code><code>) {</code>
<code> </code><code>if</code> <code>i > 3 {</code>
<code> </code><code>fmt.println(</code><code>"panicking!"</code><code>)</code>
<code> </code><code>panic(fmt.sprintf(</code><code>"%v"</code><code>, i))</code>
<code> </code><code>defer fmt.println(</code><code>"defer in g"</code><code>, i)</code>
<code> </code><code>fmt.println(</code><code>"printing in g"</code><code>, i)</code>
<code> </code><code>g(i + 1)</code>
返回了:
8
9
10
11
12
<code>calling g.</code>
<code>printing </code><code>in</code> <code>g 0</code>
<code>printing </code><code>in</code> <code>g 1</code>
<code>printing </code><code>in</code> <code>g 2</code>
<code>printing </code><code>in</code> <code>g 3</code>
<code>panicking!</code>
<code>defer </code><code>in</code> <code>g 3</code>
<code>defer </code><code>in</code> <code>g 2</code>
<code>defer </code><code>in</code> <code>g 1</code>
<code>defer </code><code>in</code> <code>g 0</code>
<code>recovered </code><code>in</code> <code>f 4</code>
<code>returned normally </code><code>from</code> <code>f.</code>
panic抛出了信息,并且跳出函数。recover接受到了信息,并且继续处理。
这个例子理解了基本就掌握了recover和panic