GO語言中回調(diào)函數(shù)的使用
0.前言
回調(diào)函數(shù)是一種在編程中常見的技術(shù),通常在異步編程中使用。簡單來說,回調(diào)函數(shù)是一個被傳遞給另一個函數(shù)的函數(shù),它在該函數(shù)的某個時間點被調(diào)用,以完成某些特定的操作或任務(wù)。
在Go語言中,可以將函數(shù)直接作為參數(shù)傳遞給另一個函數(shù),并在需要時被調(diào)用,這樣大大的加強(qiáng)了代碼的可定制化,但是也一定程度上減少了代碼的可讀性,所以在實際使用的時候要學(xué)會取舍。
1.使用
異步編程:通常情況下,回調(diào)函數(shù)在異步操作完成后被調(diào)用,以便通知調(diào)用方該操作已完成或返回異步操作的結(jié)果,回調(diào)函數(shù)可定制化,所以可以做不同的一些工作。
如果某種邏輯,有幾種實現(xiàn)方法,那么可以使用回調(diào)函數(shù),將實現(xiàn)和邏輯解耦,提高可復(fù)用性和可維護(hù)性。例如簡易計算器和sort.Slice函數(shù)(在下面有代碼演示)。
2.幾個例子
2.1 異步訪問URL
首先定義type callback func(data []byte, err error)作為回調(diào)函數(shù)的類型,隨后寫讀取URL的邏輯(fetch函數(shù)),在主函數(shù)中,傳入回調(diào)函數(shù)和URL,并通過channel異步地調(diào)用此函數(shù),通過WaitGroup等待協(xié)程的返回,其中回調(diào)函數(shù)定義了讀取的內(nèi)容如何使用,是可定制的。
package main import ( ? ?"fmt" ? ?"io/ioutil" ? ?"net/http" ? ?"sync" ? ?"time" ) type callback func(data []byte, err error) var wg sync.WaitGroup func fetch(url string, c callback) { ? ?go func() { ? ? ? // 發(fā)送HTTP GET請求 ? ? ? resp, err := http.Get(url) ? ? ? if err != nil { ? ? ? ? ?c(nil, err) ? ? ? ? ?return ? ? ? } ? ? ? defer resp.Body.Close() ? ? ? // 讀取響應(yīng)數(shù)據(jù) ? ? ? data, err := ioutil.ReadAll(resp.Body) ? ? ? if err != nil { ? ? ? ? ?c(nil, err) ? ? ? ? ?return ? ? ? } ? ? ? time.Sleep(10*time.Second) ? ? ? // 調(diào)用回調(diào)函數(shù),傳遞響應(yīng)數(shù)據(jù)和錯誤信息 ? ? ? c(data, nil) ? ? ? wg.Done() ? ?}() } func main() { ? ?url := "https://www.baidu.com" ? ?wg.Add(1) ? ?fetch(url, func(data []byte, err error) { ? ? ? if err != nil { ? ? ? ? ?fmt.Println("Error:", err) ? ? ? ? ?return ? ? ? } ? ? ? fmt.Println(string(data)) ? ?}) ? ?fmt.Println("Waiting for response...") ? ?wg.Wait() }
2.2 Sort.Slice函數(shù)
GO語言的Sort.Slice函數(shù)就使用了回調(diào)函數(shù)的思想,將比較大小的邏輯交給用戶來實現(xiàn),將代碼的可定制化大大增強(qiáng)了,以下是一個使用的例子,將字符串按首字母大小進(jìn)行排序:
package main import ( ? ?"fmt" ? ?"sort" ) func main() { ? ?strs := []string{"apple", "orange", "banana", "pear"} ? ?sort.Slice(strs, func(i, j int) bool { ? ? ? return strs[i] < strs[j] ? ?}) ? ?fmt.Println(strs) } ?
2.3 簡易計算器
在此例子中,定義了一個type Operation func(int, int) int作為回調(diào)函數(shù)的類型,隨后對此函數(shù)做了不同的實現(xiàn),在主函數(shù)中,就可以直接傳入函數(shù)名,即可完成不同的邏輯運(yùn)算。
package main import "fmt" type Operation func(int, int) int func main() { ? ? // 加法運(yùn)算 ? ? result := calculate(10, 5, add) ? ? fmt.Println(result) // Output: 15 ? ? // 減法運(yùn)算 ? ? result = calculate(10, 5, subtract) ? ? fmt.Println(result) // Output: 5 ? ? // 乘法運(yùn)算 ? ? result = calculate(10, 5, multiply) ? ? fmt.Println(result) // Output: 50 ? ? // 除法運(yùn)算 ? ? result = calculate(10, 5, divide) ? ? fmt.Println(result) // Output: 2 } // 計算函數(shù),接受兩個整數(shù)和一個運(yùn)算函數(shù)作為參數(shù),返回運(yùn)算結(jié)果 func calculate(a, b int, op Operation) int { ? ? return op(a, b) } // 加法函數(shù),接受兩個整數(shù)并返回它們的和 func add(a, b int) int { ? ? return a + b } // 減法函數(shù),接受兩個整數(shù)并返回它們的差 func subtract(a, b int) int { ? ? return a - b } // 乘法函數(shù),接受兩個整數(shù)并返回它們的積 func multiply(a, b int) int { ? ? return a * b } // 除法函數(shù),接受兩個整數(shù)并返回它們的商 func divide(a, b int) int { ? ? return a / b }
到此這篇關(guān)于GO語言中回調(diào)函數(shù)的使用的文章就介紹到這了,更多相關(guān)GO語言 回調(diào)函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語言使用ioutil.ReadAll函數(shù)需要注意基本說明
這篇文章主要為大家介紹了Go語言使用ioutil.ReadAll函數(shù)需要注意基本說明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07VsCode搭建Go語言開發(fā)環(huán)境的配置教程
這篇文章主要介紹了在VsCode中搭建Go開發(fā)環(huán)境的配置教程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05