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語言基本的語法和內(nèi)置數(shù)據(jù)類型初探
這篇文章主要介紹了Go語言基本的語法和內(nèi)置數(shù)據(jù)類型,是golang入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-10-10
基于Golang設(shè)計一套可控的定時任務(wù)系統(tǒng)
這篇文章主要為大家學(xué)習(xí)介紹了如何基于Golang設(shè)計一套可控的定時任務(wù)系統(tǒng),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-07-07
Go簡單實現(xiàn)協(xié)程池的實現(xiàn)示例
本文主要介紹了Go簡單實現(xiàn)協(xié)程池的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
GoFrame通用類型變量gvar與interface基本使用對比
這篇文章主要為大家介紹了GoFrame通用類型變量gvar與interface基本使用對比,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
golang基于errgroup實現(xiàn)并發(fā)調(diào)用的方法
這篇文章主要介紹了golang基于errgroup實現(xiàn)并發(fā)調(diào)用,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-09-09

