最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

go語言中空結(jié)構(gòu)體的實(shí)現(xiàn)

 更新時(shí)間:2025年04月14日 09:13:42   作者:Achilles.Wang  
本文主要介紹了go語言中空結(jié)構(gòu)體的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

本文主要介紹了go語言中空結(jié)構(gòu)體的實(shí)現(xiàn),具體如下:

在這里插入圖片描述

空結(jié)構(gòu)體(struct{})

  • 普通理解

在結(jié)構(gòu)體中,可以包裹一系列與對(duì)象相關(guān)的屬性,但若該對(duì)象沒有屬性呢?那它就是一個(gè)空結(jié)構(gòu)體。

空結(jié)構(gòu)體,和正常的結(jié)構(gòu)體一樣,可以接收方法函數(shù)。

type Lamp struct{}

func (l Lamp) On() {
        println("On")

}
func (l Lamp) Off() {
        println("Off")
}
  • 空結(jié)構(gòu)體的妙用

空結(jié)構(gòu)體的表象特征,就是沒有任何屬性,而從更深層次的角度來說,空結(jié)構(gòu)體是一個(gè)不占用空間的對(duì)象。

使用 unsafe.Sizeof 可以輕易的驗(yàn)證這個(gè)結(jié)果

type Lamp struct{}

func main() {
    lamp := Lamp{}
    fmt.Print(unsafe.Sizeof(lamp))
}
// output: 0

基于這個(gè)特性,在一些特殊的場(chǎng)合之下,可以用做占位符使用,合理的使用空結(jié)構(gòu)體,會(huì)減小程序的內(nèi)存占用空間。

比如在使用信道(channel)控制并發(fā)時(shí),我們只是需要一個(gè)信號(hào),但并不需要傳遞值,這個(gè)時(shí)候,也可以使用 struct{} 代替。

func main() {
    ch := make(chan struct{}, 1)
    go func() {
        <-ch
        // do something
    }()
    ch <- struct{}{}
    // ...
}

在 Go 語言中,使用空結(jié)構(gòu)體(struct{})作為通道(chan)的元素類型是一種常見的優(yōu)化手段。這種做法主要出于以下幾個(gè)原因:

  • 節(jié)省內(nèi)存空結(jié)構(gòu)體 struct{} 在 Go 中不占用任何內(nèi)存空間(大小為 0 字節(jié))。因此,當(dāng)你需要一個(gè)通道來傳遞信號(hào)或同步協(xié)程時(shí),使用空結(jié)構(gòu)體可以避免不必要的內(nèi)存開銷。

  • 信號(hào)傳遞在某些場(chǎng)景下,你并不需要通過通道傳遞具體的數(shù)據(jù),而只是需要一個(gè)簡(jiǎn)單的信號(hào)機(jī)制來通知其他協(xié)程某個(gè)事件已經(jīng)發(fā)生。例如,用于關(guān)閉多個(gè)工作協(xié)程、通知某個(gè)操作完成等。此時(shí),空結(jié)構(gòu)體作為通道的元素類型非常合適。

  • 提高性能由于空結(jié)構(gòu)體不占用內(nèi)存,發(fā)送和接收空結(jié)構(gòu)體的操作通常比發(fā)送和接收復(fù)雜數(shù)據(jù)類型的通道更快。雖然這種差異在大多數(shù)情況下是微不足道的,但在高并發(fā)或高性能要求的場(chǎng)景下,這些細(xì)微的優(yōu)化可能會(huì)產(chǎn)生顯著的影響。

.關(guān)閉多個(gè)工作協(xié)程

package main

import (
    "fmt"
    "time"
)

func worker(id int, done chan struct{}) {
    for {
        select {
        case <-done:
            fmt.Printf("Worker %d shutting down\n", id)
            return
        default:
            fmt.Printf("Worker %d working\n", id)
            time.Sleep(500 * time.Millisecond)
        }
    }
}

func main() {
    done := make(chan struct{})
    numWorkers := 3

    // 啟動(dòng)多個(gè)工作協(xié)程
    for i := 1; i <= numWorkers; i++ {
        go worker(i, done)
    }

    // 模擬一些工作
    time.Sleep(2 * time.Second)

    // 發(fā)送關(guān)閉信號(hào)
    close(done)

    // 等待一段時(shí)間以確保所有工作協(xié)程都已退出
    time.Sleep(1 * time.Second)
}

在這個(gè)例子中,done 通道被用來通知所有工作協(xié)程停止工作。我們不需要通過通道傳遞任何實(shí)際的數(shù)據(jù),只需要一個(gè)信號(hào)即可。

.同步操作完成

package main

import (
    "fmt"
    "sync"
)

func task(id int, wg *sync.WaitGroup, done chan struct{}) {
    defer wg.Done()
    fmt.Printf("Task %d completed\n", id)
    done <- struct{}{} // 發(fā)送一個(gè)空結(jié)構(gòu)體表示任務(wù)完成
}

func main() {
    var wg sync.WaitGroup
    done := make(chan struct{}, 3) // 緩沖區(qū)大小為任務(wù)數(shù)量

    for i := 1; i <= 3; i++ {
        wg.Add(1)
        go task(i, &wg, done)
    }

    // 等待所有任務(wù)完成
    go func() {
        wg.Wait()
        close(done)
    }()

    // 接收所有完成信號(hào)
    for range done {
        fmt.Println("Received completion signal")
    }

    fmt.Println("All tasks completed")
}

在這個(gè)例子中,每個(gè)任務(wù)完成后都會(huì)向 done 通道發(fā)送一個(gè)空結(jié)構(gòu)體,表示任務(wù)已完成。主協(xié)程通過讀取 done 通道中的信號(hào)來確認(rèn)所有任務(wù)是否已完成。

到此這篇關(guān)于go語言中空結(jié)構(gòu)體的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)go語言 空結(jié)構(gòu)體內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go語言并發(fā)之WaitGroup的用法詳解

    Go語言并發(fā)之WaitGroup的用法詳解

    這篇文章主要詳細(xì)介紹了Go語言并發(fā)中得到WaitGroup,文中有相關(guān)的代碼示例供大家參考,對(duì)我們的學(xué)習(xí)或工作有一定的參考價(jià)值,感興趣的同學(xué)跟著小編一起來學(xué)習(xí)吧
    2023-06-06
  • golang包快速生成base64驗(yàn)證碼的方法

    golang包快速生成base64驗(yàn)證碼的方法

    這篇文章主要介紹了golang包快速生成base64驗(yàn)證碼的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • golang中context的作用詳解

    golang中context的作用詳解

    這篇文章主要介紹了golang中context的作用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • Golang通道阻塞情況與通道無阻塞實(shí)現(xiàn)小結(jié)

    Golang通道阻塞情況與通道無阻塞實(shí)現(xiàn)小結(jié)

    本文主要介紹了Golang通道阻塞情況與通道無阻塞實(shí)現(xiàn)小結(jié),詳細(xì)解析了通道的類型、操作方法以及垃圾回收機(jī)制,從基礎(chǔ)概念到高級(jí)應(yīng)用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • Golang內(nèi)存分配機(jī)制詳解

    Golang內(nèi)存分配機(jī)制詳解

    Go 語言的內(nèi)存分配機(jī)制是理解和優(yōu)化 Go 程序性能的關(guān)鍵,在 Go 中,內(nèi)存管理是自動(dòng)進(jìn)行的,這得益于 Go 的垃圾回收機(jī)制,了解內(nèi)存如何分配和回收,可以幫助我們寫出更高性能的代碼,本文將深入講解下 Go 內(nèi)存分配機(jī)制,需要的朋友可以參考下
    2023-12-12
  • 從源碼深入理解golang?RWMutex讀寫鎖操作

    從源碼深入理解golang?RWMutex讀寫鎖操作

    這篇文章主要介紹了從源碼深入理解golang?RWMutex讀寫鎖操作,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-05-05
  • gin自定義中間件解決requestBody不可重復(fù)讀問題(最新推薦)

    gin自定義中間件解決requestBody不可重復(fù)讀問題(最新推薦)

    這篇文章主要介紹了gin自定義中間件解決requestBody不可重復(fù)讀問題,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04
  • Go時(shí)間格式化的實(shí)現(xiàn)

    Go時(shí)間格式化的實(shí)現(xiàn)

    本文主要介紹了Go時(shí)間格式化的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Go語言常見錯(cuò)誤之a(chǎn)ny沒傳遞任何信息解決分析

    Go語言常見錯(cuò)誤之a(chǎn)ny沒傳遞任何信息解決分析

    Go語言,由于其高效強(qiáng)大的并行處理能力和優(yōu)雅簡(jiǎn)單的設(shè)計(jì)哲學(xué),一直以來都是編程世界的寵兒,然而,對(duì)于一些Go新手和甚至熟悉Go的程序員也可能會(huì)遇到一個(gè)常見的錯(cuò)誤:?any沒傳遞任何信息,那么,如何規(guī)避這個(gè)錯(cuò)誤,本文將揭示其中的秘密
    2024-01-01
  • Go語言實(shí)現(xiàn)運(yùn)算符重載的方法詳解

    Go語言實(shí)現(xiàn)運(yùn)算符重載的方法詳解

    這篇文章主要為大家詳細(xì)介紹了如何利用Go語言實(shí)現(xiàn)運(yùn)算符重載的方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-09-09

最新評(píng)論

阳朔县| 丽水市| 龙泉市| 恩施市| 微博| 河源市| 漯河市| 鸡东县| 永安市| 桐庐县| 涪陵区| 鄂伦春自治旗| 集贤县| 绥宁县| 汤原县| 文成县| 旅游| 靖西县| 竹溪县| 蒲江县| 屯留县| 二连浩特市| 扎兰屯市| 阳城县| 门源| 日喀则市| 电白县| 潞城市| 沐川县| 前郭尔| 屯留县| 嘉定区| 潮安县| 页游| 康保县| 遵义市| 苍溪县| 溆浦县| 香港| 青川县| 惠东县|