go語言函數

這裏要說一下是Go函數和一些其他語言不一樣的地方

1 函數格式不同

?
1
2
3
4
5
6
func GetMsg(i int) (r string) {
    fmt.Println(i)
    r = "hi"
    return r
 
}

func說明這個是個函數

GetMsg是函數名

(i int) 函數接收一個int參數

(r string) 函數返回一個string類型返回值

2 函數可以返回多個返回值

這點和c,php都不一樣,和lua是一樣的

?
1
2
3
4
5
6
7
func GetMsg(i int) (r string, err string) {
    fmt.Println(i)
    r = "hi"
    err = "no err"
    return r,err
 
}

3 defer的使用

defer的意思是"在函數退出時調用",特別用於對文件進行讀寫操作的時候,需要在open之後要調用close操作,將close操作使用defer

?
func ReadFile(filePath string)(){
    file.Open(filePath)
    defer file.Close()
     
    if true {
        file.Read()
    } else {
        return false
    }
 
}

這樣寫的意思是在file.Open後不立即調用close,當return false的時候調用file.Close().這樣就有效避免了C語言中的內存泄露問題。

4 比較難理解的:panic,recover和defer

推薦看這篇博客:

http://blog.golang.org/2010/08/defer-panic-and-recover.html

defer的作用上一節說得很清楚了。

Panic和Recover我們就將他們看成是其他語言中的throw和catch

下面這個例子:

?
package main
 
import "fmt"
 
func main() {
    f()
    fmt.Println("Returned normally from f.")
}
 
func f() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered in f", r)
        }
    }()
    fmt.Println("Calling g.")
    g(0)
    fmt.Println("Returned normally from g.")
}
 
func g(i int) {
    if i > 3 {
        fmt.Println("Panicking!")
        panic(fmt.Sprintf("%v", i))
    }
    defer fmt.Println("Defer in g", i)
    fmt.Println("Printing in g", i)
    g(i + 1)
}

返回了:

?
1
2
3
4
5
6
7
8
9
10
11
12
Calling g.
Printing in g 0
Printing in g 1
Printing in g 2
Printing in g 3
Panicking!
Defer in g 3
Defer in g 2
Defer in g 1
Defer in g 0
Recovered in f 4
Returned normally from f.

Panic拋出了信息,並且跳出函數。Recover接受到了信息,並且繼續處理。

這個例子理解了基本就掌握了Recover和Panic

轉載自:http://www.cnblogs.com/yjf512/archive/2012/06/03/2532502.html

發佈了34 篇原創文章 · 獲贊 18 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章