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