go語言中空結構體

在這里插入圖片描述

空結構體(struct{})

  • 普通理解

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

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

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

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

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

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

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

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

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

  3. 提高性能
    由于空結構體不占用內存,發送和接收空結構體的操作通常比發送和接收復雜數據類型的通道更快。雖然這種差異在大多數情況下是微不足道的,但在高并發或高性能要求的場景下,這些細微的優化可能會產生顯著的影響。

.關閉多個工作協程

package mainimport ("fmt""time"
)func worker(id int, done chan struct{}) {for {select {case <-done:fmt.Printf("Worker %d shutting down\n", id)returndefault:fmt.Printf("Worker %d working\n", id)time.Sleep(500 * time.Millisecond)}}
}func main() {done := make(chan struct{})numWorkers := 3// 啟動多個工作協程for i := 1; i <= numWorkers; i++ {go worker(i, done)}// 模擬一些工作time.Sleep(2 * time.Second)// 發送關閉信號close(done)// 等待一段時間以確保所有工作協程都已退出time.Sleep(1 * time.Second)
}

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

.同步操作完成

package mainimport ("fmt""sync"
)func task(id int, wg *sync.WaitGroup, done chan struct{}) {defer wg.Done()fmt.Printf("Task %d completed\n", id)done <- struct{}{} // 發送一個空結構體表示任務完成
}func main() {var wg sync.WaitGroupdone := make(chan struct{}, 3) // 緩沖區大小為任務數量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 通道發送一個空結構體,表示任務已完成。主協程通過讀取 done 通道中的信號來確認所有任務是否已完成。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/72981.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/72981.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/72981.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Unity實現連連看連線效果

1.一個比較簡單的向量計算&#xff0c;用的LineRenderer實現&#xff1b; 已知起始A點和終點C點&#xff0c;求B點&#xff1b; 先計算A點到C點的向量取歸一化當做方向&#xff0c;再給定一個“模長”&#xff08;B點到A點的模長&#xff09;乘以該方向&#xff0c;最后加上L…

【MySQL】觸發器與存儲引擎

目錄 觸發器基本概念觸發器操作創建觸發器NEW 與 OLD查看觸發器刪除觸發器 注意事項 存儲引擎基本概念基本操作查詢當前數據庫支持的存儲引擎查看當前的默認存儲引擎查看某個表用的存儲引擎創建表時指定存儲引擎修改表的存儲引擎 觸發器 基本概念 概述&#xff1a; 觸發器&a…

能“嘎嘎提升”提升用戶居住體驗的智能家居物聯網框架推薦!

智能家居在日常生活中給我們的帶來了更多的便利&#xff0c;更讓有些用戶切實地體會到了科技的魅力&#xff0c;對于想要打造屬于自己的智能家居氛圍感的用戶們&#xff0c;以下是一些能夠幫助提升居住體驗的智能家居物聯網框架及應用&#xff1a; 1. 涂鴉智能&#xff08;Tuy…

DevEco Studio的使用

目錄 1.創建ArkTS工程 2.ArkTS工程目錄結構&#xff08;Stage模型&#xff09; 構建第一個頁面 構建第二個頁面 實現頁面間的跳轉 1.創建ArkTS工程 若首次打開DevEco Studio&#xff0c;請點擊Create Project創建工程。如果已經打開了一個工程&#xff0c;請在菜單欄選擇…

性能監控——vmstat

性能監控——vmstat ? 性能監控是對 IT 系統運行效率和有效性的系統觀察和測量。它涉及收集、分析和報告各種組件&#xff08;包括應用程序、網絡、服務器和數據庫&#xff09;的關鍵性能指標 (KPI)。此過程使用專門的工具來跟蹤響應時間、吞吐量、資源利用率和錯誤率等指標。…

搭建Python量化開發環境:從零開始的完整指南

搭建Python量化開發環境&#xff1a;從零開始的完整指南 在量化投資領域&#xff0c;一個穩定且高效的開發環境是成功的關鍵。本文將引導你一步步搭建起自己的Python量化開發環境&#xff0c;確保你能夠順利開始編寫和運行量化策略。 &#x1f680;量化軟件開通 &#x1f68…

圖像分割的mask有空洞怎么修補

分享一個對實例分割mask修補的方法&#xff0c;希望對大家有所幫助。 1. 這是我準備分割的圖片 2 分割結果 可以看到衣服部分有一些沒分割出來&#xff0c;二值化圖片能清晰看到衣服部分有些黑色未分出的地方。 3 補全mask區域 import cv2 import numpy as npdef fill_mask_h…

Qt 控件概述 QLabel

目錄 QLabel顯示類控件 label如何做到與窗口同步變化 邊框 Frame QLabel顯示類控件 ?? ?? textFormat &#xff1a;設置文件格式 ? Pixmap &#xff1a;標簽圖片 label如何做到與窗口同步變化 Qt中對應用戶的操作 &#xff1a; 事件和信號 拖拽窗口大小就會觸發…

詞頻統計 ccf-csp 2024-2-1

在學習了文本處理后&#xff0c;小 P 對英語書中的 n篇文章進行了初步整理。 具體來說&#xff0c;小 P將所有的英文單詞都轉化為了整數編號。 假設這 n 篇文章中共出現了 m個不同的單詞&#xff0c;則把它們從 1到 m進行編號。 這樣&#xff0c;每篇文章就簡化為了一個整數…

用爬蟲解鎖 Shopee 店鋪商品數據,開啟電商新洞察

在電商競爭白熱化的當下&#xff0c;Shopee 作為全球知名的電商平臺&#xff0c;匯聚了海量的商品與商機。對于電商從業者、數據分析師、創業者來說&#xff0c;精準掌握 Shopee 店鋪的商品信息&#xff0c;就如同手握一把開啟財富大門的鑰匙。而爬蟲技術&#xff0c;無疑是幫助…

k8s中的service解析

k8s中的service解析 在k8s中&#xff0c;我們可以通過pod來創建服務。 然而&#xff0c;當我們創建多個 Pod 來提供同一項服務時&#xff0c;直接通過 Pod IP 進行訪問會變得復雜且不可維護。因此&#xff0c;Kubernetes 提供了 Service 這一抽象概念&#xff0c;用于對外暴露…

git 命令回退版本

1、查看提交記錄 git log --oneline # 簡化的提交歷史&#xff08;推薦&#xff09; # 或 git log # 完整提交歷史2、版本回退 git reset --hard <commit-hash>3、如果已推送過代碼到遠程倉庫&#xff0c;需強制推送更新 git push -f

深度學習與傳統算法在人臉識別領域的演進:從Eigenfaces到ArcFace

一、傳統人臉識別方法的發展與局限 1.1 Eigenfaces&#xff1a;主成分分析的經典實踐 算法原理 Eigenfaces是基于主成分分析&#xff08;PCA&#xff09;的里程碑式方法。其核心思想是將人臉圖像視為高維向量&#xff0c;通過協方差矩陣計算特征向量&#xff08;即特征臉&…

串口接收不到數據,串口RX配置(f407),f103和f407的區別

問題 芯片&#xff1a;STM32F407&#xff0c;軟件&#xff1a;標準庫 使用串口時&#xff0c;直接把之前STM32F103的串口配置移植過來&#xff0c;同樣以串口4為例&#xff0c;代碼如下&#xff1a; STM32F103 UART4&#xff1a; void UART4_Configuration(uint32_t BaudRa…

淺分析 PE3R 感知高效的三維重建

"近期&#xff0c;二維到三維感知技術的進步顯著提升了對二維圖像中三維場景的理解能力。然而&#xff0c;現有方法面臨諸多關鍵挑戰&#xff0c;包括跨場景泛化能力有限、感知精度欠佳以及重建速度緩慢。為克服這些局限&#xff0c;我們提出了感知高效三維重建框架&#…

存算一體與存算分離:架構設計的深度解析與實現方案

隨著數據量的不斷增大和對計算能力的需求日益提高&#xff0c;存算一體作為一種新型架構設計理念&#xff0c;在大數據處理、云計算和人工智能等領域正逐步引起廣泛關注。在深入探討存算一體之前&#xff0c;我們需要先了解存儲和計算的基本概念&#xff0c;以及存算分離和存算…

匯編與反匯編:DEBUG 命令使用指南

前言 匯編語言是計算機底層編程語言&#xff0c;直接與 CPU 指令集對應。掌握匯編語言和調試工具&#xff08;如DEBUG&#xff09;是深入理解計算機工作原理的關鍵。本文將介紹匯編與反匯編的基本概念&#xff0c;并詳細講解如何使用 DEBUG 命令進行調試和內存操作。 目錄 一、…

數據分析的12個挑戰及其解決方法

俗話說得好“說起來容易做起來難。”數據分析對于風險管理者是極為重要的。我們可以利用數據分析結論&#xff0c;來為企業決策做有效協助&#xff0c;幫助企業改善財務狀況&#xff0c;提升企業業務銷售水平&#xff0c;幫助員工預測可能發生的問題&#xff0c;并協助監控企業…

棧/堆/static/虛表

在 C 里&#xff0c;棧空間主要用來存放局部變量、函數調用信息等。下面為你介紹棧空間在 C 里的運用方式。 1. 局部變量的使用 在函數內部定義的變量會被存于棧空間&#xff0c;當函數執行結束&#xff0c;這些變量會自動被銷毀。 #include <iostream>void exampleFu…

Vue keepalive學習用法

在Vue中&#xff0c;<keep-alive>的include屬性用于指定需要緩存的組件&#xff0c;其實現方式如下&#xff1a; 1. 基本用法 ? 字符串形式&#xff1a;通過逗號分隔組件名稱&#xff0c;匹配到的組件會被緩存。 <keep-alive include"ComponentA,ComponentB&…