zoukankan      html  css  js  c++  java
  • 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
    • 空结构体的特点
      • 不占用内存
      • 地址不变
    • 空结构体作用
      • 建议用于传递信号的通道,因为不占用内存

  • 相关阅读:
    玩4K必备知识:HDMI1.4、2.0、2.0a、2.0b接口参数对比【扫盲贴】
    Gradle配置最佳实践
    Android Studio 中安装 apk 被拆分成多个 slice,如何禁止?
    编译不同平台 设定
    编译找错
    Delphi 中内存映射对于大文件的使用
    linux——nmap端口扫描命令
    Android 使用 adb命令 远程安装apk
    插件编译 版本问题
    2019 opensuse linux Eclipse
  • 原文地址:https://www.cnblogs.com/peterleee/p/13564836.html
Copyright © 2011-2022 走看看