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
    
    • 总结
      • 空结构体的特点
        • 不占用内存
        • 地址不变
      • 空结构体作用
        • 建议用于传递信号的通道,因为不占用内存
  • 相关阅读:
    VS2010调用外部webservice
    VS2013如何调用别人发布的WebService程序
    VS2010 根据WSDL文件(java Web Service)生成.cs文件
    vs2010 创建和发布 webservice
    CXF+Spring+Tomcat 案例
    LDAP方式连接AD获取用户信息
    webService和RMI
    当spring抛出异常时出现的页面的@ExceptionHandler(RuntimeException.class) 用法
    eclips中maven解决jsp报错的问题
    用idea搭建一个简单的SSM的Demo
  • 原文地址:https://www.cnblogs.com/MyUniverse/p/11595043.html
Copyright © 2011-2022 走看看