天天看點

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