Golang學習筆記--函式作為值的使用
概念
在C和C++中,函式是一組指令的集合,這組指令的入口地址用函式名來表示,所以,在C和C++中,函式名稱是一個地址。
但是在Go語言中,函式是一種型別,而且是第一型別(first-class)。他的地位和int string等型別是一樣的。
我們經常會宣告一個值型別為int或者string型別的變數,現在我們可以宣告一個值型別為某個函式的變數,這種變數叫做函式變數也就是說,函式可以被當做一個值型別賦值給變數
例子:
func Add(a,b int)int{ return a+b } func simple01(){ //宣告一個int型別的變數 var number = 3 fmt.Println(number) //宣告一個string型別的變數 str:="aabbcc" fmt.Println(str) //現在我們宣告一個函式型別的變數 myFunc:=Add //通過函式變數呼叫函式(用函式指標來理解,還是很容易的) fmt.Println(myFunc(1,2)) }
執行結果:
3
aabbcc
3
函式變數的用法
最基本的用法,函式變數被直接當做值進行傳遞,如:傳入函式的引數可以傳入一個函式變數
例子:
type ProcessBasename func(string)string //basename函式 移除字串的路徑部分和.字尾 只取檔名 func basename(str string)string{ //去除路徑部分 slash:=strings.LastIndex(str,"/") //如果沒有找到"/" LastIndex返回-1 str=str[slash+1:] //取出.的前一部分 if dot:=strings.LastIndex(str,".");dot>0{ str = str[:dot] } return str } //這個函式使用了函式變數作為引數 func GetBaseName(str string,myBasenameFunc func(string)string)string{ return myBasenameFunc(str) } //這個函式使用了type關鍵字自定義的型別(底層是一種函式型別) func GetBaseName1(str string,processBasename ProcessBasename)string{ return processBasename(str) } //函式變數被當做函式引數傳遞 func simple02(){ str:="a/b/c.go" //將函式basename作為實參傳遞給GetBaseName //要注意,函式變數basename的函式簽名要和形參myBasenameFunc的函式簽名完全一致 //在這裡,函式簽名是指 函式的引數和返回值 fmt.Println(GetBaseName(str,basename)) str1:="c.d.go" fmt.Println(GetBaseName1(str1,basename)) }
執行結果:
c
總結
函式變數使用的步驟和意義
1.定義一個底層為函式型別的自定義型別 2.實現定義的函式型別 3.作為引數呼叫
使用函式變數,可以使得程式在呼叫該函式型別的地方根據使用者傳遞的實際函式來執行邏輯。使得程式更加靈活
例子:在程式中根據使用者傳遞的實際函式來實現兩個數字加還是減
type CalculateFunc func(a,b int)int func Add(a,b int)int{ return a+b } func Sub(a,b int)int{ return a-b } func Calculate(a,b int,calculateFunc CalculateFunc)int{ return calculateFunc(a,b) } func simple03(){ a,b:=5,3 //相加 add:=Calculate(a,b,Add) //相減 sub:=Calculate(a,b,Sub) println(add,sub) } func main(){ simple01() simple02() simple03() }
執行結果:
8 2