欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

GO語言中回調(diào)函數(shù)的使用

 更新時間:2023年03月06日 10:11:09   作者:雨雨不怕雨  
本文主要介紹了GO語言中回調(diào)函數(shù)的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

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ù)需要注意基本說明

    這篇文章主要為大家介紹了Go語言使用ioutil.ReadAll函數(shù)需要注意基本說明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • Golang中Map按照Value大小排序的方法實例

    Golang中Map按照Value大小排序的方法實例

    這篇文章主要給大家介紹了關(guān)于Golang中Map按照Value大小排序的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2022-03-03
  • 詳解Golang如何在編譯時注入版本信息

    詳解Golang如何在編譯時注入版本信息

    這篇文章主要為大家詳細(xì)介紹了Golang如何在編譯時實現(xiàn)注入版本信息,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價值,感興趣的可以了解一下
    2023-06-06
  • VsCode搭建Go語言開發(fā)環(huán)境的配置教程

    VsCode搭建Go語言開發(fā)環(huán)境的配置教程

    這篇文章主要介紹了在VsCode中搭建Go開發(fā)環(huán)境的配置教程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-05-05
  • Go語言中錯誤處理的方式總結(jié)

    Go語言中錯誤處理的方式總結(jié)

    這篇文章會結(jié)合?errors?中的函數(shù),來討論一下?Go?中常見的?error?使用方式,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價值,需要的可以了解一下
    2023-07-07
  • Golang中的sync包的WaitGroup操作

    Golang中的sync包的WaitGroup操作

    這篇文章主要介紹了Golang中的sync包的WaitGroup操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • go程序執(zhí)行交叉編譯的流程步驟

    go程序執(zhí)行交叉編譯的流程步驟

    go程序可用通過交叉編譯的方式在一個平臺輸出多個平臺可運(yùn)行的二進(jìn)制包,本文給大家詳細(xì)介紹了go程序執(zhí)行交叉編譯的流程步驟,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下
    2024-07-07
  • go中如何獲取本機(jī)ip地址

    go中如何獲取本機(jī)ip地址

    這篇文章主要介紹了go中如何獲取本機(jī)ip地址問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 淺析Golang中字符串拼接問題

    淺析Golang中字符串拼接問題

    Go的字符串是一個不可改變的數(shù)據(jù)結(jié)構(gòu),這和其他語言如JAVA,C++等的設(shè)定很類似.總體來說,有如下五種拼接方式,下面我們將論述各種方式的性能問題,以及如何選擇
    2023-04-04
  • 詳解go中panic源碼解讀

    詳解go中panic源碼解讀

    這篇文章主要介紹了go中panic源碼解讀,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04

最新評論