您好,登錄后才能下訂單哦!
這篇文章主要講解了“GO語言中接口和接口型函數如何使用”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“GO語言中接口和接口型函數如何使用”吧!
// A Getter loads data for a key. type Getter interface { Get(key string) ([]byte, error) } // A GetterFunc implements Getter with a function. type GetterFunc func(key string) ([]byte, error) // Get implements Getter interface function func (f GetterFunc) Get(key string) ([]byte, error) { return f(key) }
以上的例程中,首先定義了一個接口,隨后定義了一個函數類型實現了此接口,那么GO語言中的接口到底怎么使用呢?
在GO語言中,接口是一種類型,它定義了一組方法的組合,但沒有具體的代碼實現,接口定義示例如下:
type MyInterface interface { Method1() string Method2(int) int }
GO語言中,接口的實現是隱式的。接口實現要綁定在一個類型上面,通過實現類型的方法,來隱式的實現接口,實現示例如下:
type MyType struct { // type fields } func (t *MyType) Method1() string { return "Hello, world!" } func (t *MyType) Method2(n int) int { return n * n }
實現接口后,我們可以把接口作為參數傳入某個函數中,這樣實現了接口的不同數據結構就可以都作為接口傳入函數中了:
func MyFunction(i MyInterface) { fmt.Println(i.Method1()) fmt.Println(i.Method2(8)) }
調用此函數時,就可以先聲明實現了此接口的數據結構,然后調用函數即可:
func main() { t := &MyType{} MyFunction(t) }
調用后即可產生結果:
Hello, world!
64
以上是使用的結構體隱式實現了接口,還可以自定義函數類型來隱式實現接口。這樣可以使用匿名函數或者普通函數(都需要類型轉換)直接作為接口參數傳入函數中。接口及實現如下:
type MyInterface interface { Method1() string } type MyInterfaceFunc func()string func (f MyInterfaceFunc) Method1()string { return f() }
定義一個以接口為參數的函數:
func MyFunction(i MyInterfaceFunc){ fmt.Println(i.Method1()) }
使用普通函數進行調用:
func Dog()string{ return "dog dog !" } func main() { MyFunction(MyInterfaceFunc(Dog)) }
使用匿名函數進行調用:
func main() { MyFunction(MyInterfaceFunc(func() string { return "hello!" })) }
可以看到,最終的輸出都是正確的:
dog dog !
hello!
總的來說,大大的增加了代碼的可擴展性,如果沒有接口型函數的話,那么想要實現一個新的函數,就需要聲明新的類型(如結構體),再隱式的實現接口,再傳入MyFunction函數中。有了接口型函數后,那么只需要實現核心邏輯,隨后將函數轉換為預期的類型即可直接傳入。
net/http 的 Handler 和 HandlerFunc 就是一個典型的接口型函數的例子,Handler的定義如下:
type Handler interface { ServeHTTP(ResponseWriter, *Request) } type HandlerFunc func(ResponseWriter, *Request) func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) { f(w, r) }
可以使用http.Handle來對經典的映射路徑和處理函數進行映射:
func Handle(pattern string, handler Handler)
觀察這個函數,可以發現跟上文的例子很類似,這里的handler就是接口類型,然后在HandlerFunc的基礎上做了實現,那么我們可以進行如下的使用:
func home(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) _, _ = w.Write([]byte("hello, index page")) } func main() { http.Handle("/home", http.HandlerFunc(home)) _ = http.ListenAndServe("localhost:8000", nil) }
運行起來后,就會監聽localhost:8000并運行home函數。這里將home進行類型轉換為http.HandlerFunc再作為接口類型傳入http.Handle,非常的方便。
我們同樣可以使用匿名函數的形式:
func main() { http.Handle("/home", http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) { writer.WriteHeader(http.StatusOK) writer.Write([]byte("hello word!")) })) _ = http.ListenAndServe("localhost:8000", nil) }
可以達到同樣的效果。
感謝各位的閱讀,以上就是“GO語言中接口和接口型函數如何使用”的內容了,經過本文的學習后,相信大家對GO語言中接口和接口型函數如何使用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。