go struct{} 空結構體的特點和作用


空結構體的特點和作用

  • 參考代碼
package main

import (
	"fmt"
	"unsafe"
)


func main() {
	empStruct()
} 

//空結構體的實例和作用
func empStruct(){
	//空結構體的特點:1、不占用內存;2、地址不變
	var s struct{}
	var s1 struct{}
	fmt.Println("空結構體占用內存的情況:",unsafe.Sizeof(s))
	fmt.Printf("空結構體指針指向情況:s = %p, s1 = %p,兩個指針的比較結果:%v",&s,&s1,&s==&s1)
	strChan := make(chan string,3)
	signChan := make(chan struct{},1)  //接收數據信號
	signChan1 := make(chan struct{},2) //操作完成信號

	go func(){
		// 用來接收信息
		<- signChan  //阻塞協程,直到signChan接收到值
		for value := range strChan{
			fmt.Println("接收到值為:",value)
		}
		signChan1 <- struct{}{}
	}()

	go func(){
		// 模擬發送數據
		for index,value := range []string{"1","2","3"}{
			fmt.Println("發送數據:",value)
			strChan <- value
			if index==2{
				signChan <- struct{}{} 
			}
		}
		close(strChan)
		signChan1 <- struct{}{}
	}()

	fmt.Println("等待上面連個協程運行結束")
	<- signChan1  
	<- signChan1  //阻塞,直到上面兩個協程完成
}
  • 輸出結果
===================空結構體測試=============
空結構體占用內存的情況: 0
空結構體指針指向情況:s = 0x58ccd8, s1 = 0x58ccd8,兩個指針的比較結果:true等待上面連個協程運行結束
發送數據: 1
發送數據: 2
發送數據: 3
接收到值為: 1
接收到值為: 2
接收到值為: 3
  • 總結
    • 空結構體的特點
      • 不占用內存
      • 地址不變
    • 空結構體作用
      • 建議用於傳遞信號的通道,因為不占用內存


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM