天天看点

Go语言_函数学习篇1 函数格式不同2 函数可以返回多个返回值3 defer的使用4 比较难理解的:panic,recover和defer

这里要说一下是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 &gt; 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