本文為轉(zhuǎn)載,原文:Golang 學習筆記(02)—— 函數(shù)
函數(shù)定義
函數(shù)
是每一門開發(fā)語言的最基礎的部件,下面看下go語言中的函數(shù)是怎么定義的:
func Add(a, b int)int{
return a + b
}
func
是定義函數(shù)的關鍵字,Add
是函數(shù)名稱,int
是返回值,小括號內(nèi)是函數(shù)的參數(shù)。可以隨意安排函數(shù)定義的順序,go在編譯時會掃描所以的文件。
多返回值
go中函數(shù)支持多返回值,可以返回任意數(shù)量的返回值。多值返回在Go語言中是經(jīng)常被用到的,比如,一個函數(shù)同時返回結果和異常。
下面我們看一個例子,divide
函數(shù)是計算a/b的結果,返回商和余數(shù)。
package main
import "fmt"
func main(){
quotient, remainder := divide(5, 3)
fmt.Println("商為:", quotient, "余數(shù)為:", remainder)
}
func divide(a, b int)(int, int){
quotient := a / b
remainder := a % b
return quotient, remainder
}
變參函數(shù)
go中的函數(shù)支持變參,變參就是說函數(shù)可以有任意數(shù)量的參數(shù)。變參本質(zhì)上就是一個slice
,且必須是最后一個參數(shù)
。將slice
傳遞給變參函數(shù)時,注意用...
展開,否則就當做單個參數(shù)處理了。
請看以下例子:
package main
import "fmt"
func main(){
result := sum(3,5,7,9)
fmt.Println("結果為:", result)
}
func sum(aregs ...int) int {
s := 0
for _, number := range aregs{
s += number
}
return s
}
至于什么是
slice
,range
又是什么鬼,在后面講到數(shù)組的數(shù)組的時候詳細介紹,slice
就相當于數(shù)組,range
類似一個循環(huán),循環(huán)每個字元素的key, value。另外其中的_
表示不接受改返回值。
defer
defer是go語言所特有的,defer的作用是延遲執(zhí)行
,在函數(shù)返回前,按照棧的形式后進先出
的原則一次執(zhí)行每個defer注冊的函數(shù)。這樣可以保證函數(shù)在返回前被調(diào)用,通常用來進行資源釋放,錯誤的處理,清理數(shù)據(jù)等。下面是一個讀文件的例子。
package main
import "fmt"
import "os"
func main(){
str, err := readFile("main.go")
if err != nil{
fmt.Println(err.Error())
return
}
fmt.Println(str)
}
func readFile(strFileName string)(string, error){
f, err := os.Open(strFileName)
if err != nil{
fmt.Println("文件讀取失敗")
return "", err
}
defer f.Close()
buf := make([]byte, 1024)
var strContent string = ""
for{
n, _ := f.Read(buf)
if n == 0{
break
}
strContent += string(buf[0:n])
}
return strContent, nil
}
函數(shù)類型
函數(shù)也是一種類型,擁有相同的參數(shù),相同的返回值的函數(shù),是同一種類型。用type
來定義函數(shù)類型。下面例子中display
函數(shù)輸出大于5的數(shù)值。
package main
import "fmt"
type MyFuncType func(int) bool
func isBigThan5(n int)bool{
return n > 5
}
func display(arr []int, f MyFuncType){
for _, v := range arr{
if f(v){
fmt.Println(v)
}
}
}
func main(){
arr := []int{1,2,3,4,5,6,7,8,9}
display(arr, isBigThan5)
}
在上面的例子中,
type MyFuncType func(int) bool
定義了一個函數(shù)類型,將其命名為MyFuncType
,接受一個int類型的參數(shù),并返回一個bool類型的結果。isBigThan5
是MyFuncType
類型的函數(shù),函數(shù)類型。跟C里的函數(shù)指針有點像,他是可以把函數(shù)當做參數(shù)傳入到另一個函數(shù)里,也有點像委托。
錯誤處理
go語言中沒有try...catch...finally...
這種結構化異常處理,而是用panic
代替throw
跑出異常。使用recover
函數(shù)來捕獲異常。Recover
僅在defer
函數(shù)中使用才能捕獲到異常,此時函數(shù)的執(zhí)行流程已經(jīng)中斷,無法恢復到后續(xù)位置繼續(xù)執(zhí)行。
package main
import "fmt"
func main(){
test()
}
func test(){
defer func (){
if err := recover(); err != nil{
fmt.Println(err)
}
}()
divide(5,0)
fmt.Println("end of test")
}
func divide(a, b int) int{
return a / b
}
完
本文為原創(chuàng),轉(zhuǎn)載請注明出處
目錄
上一節(jié):Golang 學習筆記(1)—— 基礎
下一節(jié):Golang 學習筆記(3)—— 字符串操作