Golang中函數(shù)作為值與類型是什么意思

這篇文章將為大家詳細講解有關(guān)Golang中函數(shù)作為值與類型是什么意思,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設、高性價比覃塘網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式覃塘網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設找我們,業(yè)務覆蓋覃塘地區(qū)。費用合理售后完善,十多年實體公司更值得信賴。

簡介

在 Go 語言中,我們可以把函數(shù)作為一種變量,用 type 去定義它,那么這個函數(shù)類型就可以作為值傳遞,甚至可以實現(xiàn)方法,這一特性是在太靈活了,有時候我們甚至可以利用這一特性進行類型轉(zhuǎn)換。作為值傳遞的條件是類型具有相同的參數(shù)以及相同的返回值。

函數(shù)的類型轉(zhuǎn)換

Go 語言的類型轉(zhuǎn)換基本格式如下:

type_name(expression)

舉個例子:

package main        import "fmt"        type CalculateType func(int, int) 
// 聲明了一個函數(shù)類型        
// 該函數(shù)類型實現(xiàn)了一個方法    
func (c *CalculateType) Serve() {      
fmt.Println("我是一個函數(shù)類型")    }        
// 加法函數(shù)    
func add(a, b int) {      
fmt.Println(a + b)    }        
// 乘法函數(shù)    
func mul(a, b int) {      
fmt.Println(a * b)    }        
func main() {      a := CalculateType(add) 
// 將add函數(shù)強制轉(zhuǎn)換成CalculateType類型      
b := CalculateType(mul) 
// 將mul函數(shù)強制轉(zhuǎn)換成CalculateType類型      
a(2, 3)      b(2, 3)      a.Serve()      b.Serve()    }        
// 5    
// 6    
// 我是一個函數(shù)類型    
// 我是一個函數(shù)類型

如上,聲明了一個 CalculateType 函數(shù)類型,并實現(xiàn) Serve() 方法,并將擁有相同參數(shù)的 add 和 mul 強制轉(zhuǎn)換成 CalculateType 函數(shù)類型,同時這兩個函數(shù)都擁有了 CalculateType 函數(shù)類型的 Serve() 方法。

函數(shù)作參數(shù)傳遞

package main        import "fmt"        
type CalculateType func(a, b int) int 
// 聲明了一個函數(shù)類型        
// 加法函數(shù)    func add(a, b int) int {      return a + b    }        
// 乘法函數(shù)    func mul(a, b int) int {      return a * b    }        
func Calculate(a, b int, f CalculateType) int {      return f(a, b)    }        
func main() {      a, b := 2, 3      fmt.Println(Calculate(a, b, add))      
fmt.Println(Calculate(a, b, mul))    }    
// 5    
// 6

如上例子,Calculate 的 f 參數(shù)類型為 CalculateType,add 和 mul 函數(shù)具有和 CalculateType 函數(shù)類型相同的參數(shù)和返回值,因此可以將 add 和 mul 函數(shù)作為參數(shù)傳入 Calculate 函數(shù)中。

net/http 包源碼例子

// HandleFunc registers the handler function for the given pattern    
// in the DefaultServeMux.    
// The documentation for ServeMux explains how patterns are matched.    func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {      DefaultServeMux.HandleFunc(pattern, handler)    }
// HandleFunc registers the handler function for the given pattern.    func (mux *ServeMux) HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {      mux.Handle(pattern, HandlerFunc(handler))    }
type HandlerFunc func(ResponseWriter, *Request)        
// ServeHTTP calls f(w, r).    
func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {      f(w, r)    }

剛開始看到這段源碼的時候,真的有點懵逼了,這段源碼的目的是為了將我們的 Handler 強制實現(xiàn) ServeHTTP() 方法,如下例子:

func sayHi(w http.ResponseWriter, r *http.Request) 
{      
io.WriteString(w, "hi")    
}        
func main() {      
http.HandlerFunc("/", sayHi)      
http.ListenAndserve(":8080", nil)    
}

因為 HandlerFunc 是一個函數(shù)類型,而 sayHi 函數(shù)擁有和 HandlerFunc 函數(shù)類型一樣的參數(shù)值,因此可以將 sayHi 強制轉(zhuǎn)換成 HandlerFunc,因此 sayHi 也擁有了 ServeHTTP() 方法,也就實現(xiàn)了 Handler 接口,同時,HandlerFunc 的 ServeHTTP 方法執(zhí)行了它自己本身,也就是 sayHi 函數(shù),這也就可以看出來了,sayHi 就是 Handler 被調(diào)用之后的執(zhí)行結(jié)果。

關(guān)于Golang中函數(shù)作為值與類型是什么意思就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

文章題目:Golang中函數(shù)作為值與類型是什么意思
本文來源:http://www.muchs.cn/article48/jpjgep.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導航網(wǎng)站建設、關(guān)鍵詞優(yōu)化網(wǎng)站維護、網(wǎng)站收錄品牌網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化