這裡要說一下是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