Go語言_函數學習篇


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

1 函數格式不同

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是一樣的

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)
}

返回了:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM