首頁 > 後端開發 > Golang > 主體

詳解Golang中函數作為值與型

藏色散人
發布: 2020-11-13 13:58:49
轉載
2533 人瀏覽過
##上中對

golang##golang

#1欄位一起為大家介紹」類型,並希望對需要的朋友有所幫助!

詳解Golang中函數作為值與型

簡介

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

函數的型別轉換

Go 語言的型別轉換基本格式如下:

type_name(expression)
登入後複製
舉例:

package main        import "fmt"        type CalculateType func(int, int) 
// 声明了一个函数类型        
// 该函数类型实现了一个方法    
func (c *CalculateType) Serve() {      
fmt.Println("我是一个函数类型")    }        
// 加法函数    
func add(a, b int) {      
fmt.Println(a + b)    }        
// 乘法函数    
func mul(a, b int) {      
fmt.Println(a * b)    }        
func main() {      a := CalculateType(add) 
// 将add函数强制转换成CalculateType类型      
b := CalculateType(mul) 
// 将mul函数强制转换成CalculateType类型      
a(2, 3)      b(2, 3)      a.Serve()      b.Serve()    }        
// 5    
// 6    
// 我是一个函数类型    
// 我是一个函数类型
登入後複製
如上,宣告了一個CalculateType 函數類型,並實作Serve() 方法,並將擁有相同參數的add 和mul 強制轉換成CalculateType 函數類型,同時這兩個函數都擁有了CalculateType 函數類型的Serve() 方法。

函數作參數傳遞

package main        import "fmt"        
type CalculateType func(a, b int) int 
// 声明了一个函数类型        
// 加法函数    func add(a, b int) int {      return a + b    }        
// 乘法函数    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 參數類型為CalculateType,add 和mul 函數具有和CalculateType 函數類型相同的參數和傳回值,因此可以將add 和mul 函數作為參數傳入Calculate 函數中。

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 強制實作ServeHTTP() 方法,如下例子:

func sayHi(w http.ResponseWriter, r *http.Request) 
{      
io.WriteString(w, "hi")    
}        
func main() {      
http.HandlerFunc("/", sayHi)      
http.ListenAndserve(":8080", nil)    
}
登入後複製
因為HandlerFunc 是一個函式類型,而sayHi 函式擁有和HandlerFunc 函式類型一樣的參數值,因此可以將sayHi 強制轉換成HandlerFunc,因此sayHi 也擁有了ServeHTTP() 方法,也就實現了Handler 接口,同時,HandlerFunc 的ServeHTTP 方法執行了它自己本身,也就是sayHi 函數,這也就可以看出來了,sayHi 就是Handler 被調用之後的執行結果。 ###

以上是詳解Golang中函數作為值與型的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:learnku.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板