亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

go語言中空結構體的實現(xiàn)

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

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

在這里插入圖片描述

空結構體(struct{})

  • 普通理解

在結構體中,可以包裹一系列與對象相關的屬性,但若該對象沒有屬性呢?那它就是一個空結構體。

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

type Lamp struct{}

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

}
func (l Lamp) Off() {
        println("Off")
}
  • 空結構體的妙用

空結構體的表象特征,就是沒有任何屬性,而從更深層次的角度來說,空結構體是一個不占用空間的對象。

使用 unsafe.Sizeof 可以輕易的驗證這個結果

type Lamp struct{}

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

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

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

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

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

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

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

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

.關閉多個工作協(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

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

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

    // 發(fā)送關閉信號
    close(done)

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

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

.同步操作完成

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ā)送一個空結構體表示任務完成
}

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

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

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

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

    fmt.Println("All tasks completed")
}

在這個例子中,每個任務完成后都會向 done 通道發(fā)送一個空結構體,表示任務已完成。主協(xié)程通過讀取 done 通道中的信號來確認所有任務是否已完成。

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

相關文章

  • Go代碼的組織和格式化規(guī)則實戰(zhàn)示例

    Go代碼的組織和格式化規(guī)則實戰(zhàn)示例

    這篇文章主要為大家介紹了Go代碼的組織和格式化示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • 解決golang.org不能訪問的問題(推薦)

    解決golang.org不能訪問的問題(推薦)

    這篇文章主要介紹了解決golang.org不能訪問的問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-11-11
  • Go gRPC超時控制Deadlines用法詳解

    Go gRPC超時控制Deadlines用法詳解

    這篇文章主要為大家介紹了Go gRPC超時控制Deadlines用法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • Go調(diào)度器學習之協(xié)作與搶占詳解

    Go調(diào)度器學習之協(xié)作與搶占詳解

    如果某個G執(zhí)行時間過長,其他的G如何才能被正常調(diào)度,這就引出了接下來的話題:協(xié)作與搶占。本文將通過一些示例為大家詳細講講調(diào)度器中協(xié)作與搶占的相關知識,需要的可以參考一下
    2023-04-04
  • Go語言字符串處理庫strings包詳解

    Go語言字符串處理庫strings包詳解

    本文詳細介紹了Go語言中的strings庫的使用方法,包括字符串的查找、替換、分割、比較、大小寫轉換等操作,strings庫是Go語言中非常重要且功能豐富的標準庫,幾乎涵蓋了所有字符串處理的需求
    2024-09-09
  • Golang時間處理中容易踩的坑分析解決

    Golang時間處理中容易踩的坑分析解決

    這篇文章主要為大家介紹了Golang時間處理中容易踩的坑分析解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • Go語言中的延遲函數(shù)defer示例詳解

    Go語言中的延遲函數(shù)defer示例詳解

    眾所周知golang的defer優(yōu)雅又簡潔, 是golang的亮點之一。所以下面這篇文章主要給大家介紹了關于Go語言中延遲函數(shù)defer的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧。
    2017-10-10
  • 一文帶你了解Go語言中的I/O接口設計

    一文帶你了解Go語言中的I/O接口設計

    I/O?操作在編程中扮演著至關重要的角色,它涉及程序與外部世界之間的數(shù)據(jù)交換,下面我們就來簡單了解一下Go語言中的?I/O?接口設計吧
    2023-06-06
  • Go語言斷言和類型查詢的實現(xiàn)

    Go語言斷言和類型查詢的實現(xiàn)

    Go語言變量類型包含基礎類型和復合類型,類型斷言一般是對基礎類型的處理,本文主要介紹了Go語言斷言和類型查詢的實現(xiàn),感興趣的可以了解一下
    2024-01-01
  • Go http client 連接池不復用的問題

    Go http client 連接池不復用的問題

    這篇文章主要介紹了Go http client 連接池不復用的問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01

最新評論