Golang空结构体struct{}的作用?

这篇具有很好参考价值的文章主要介绍了Golang空结构体struct{}的作用?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

介绍

在平时做项目得时候,经常会看到很多包里面定义了结构体。
e.g. 在context包里面Context接口中的Done()方法,Done()返回一个是以空结构体定义数据的通道chan struct{},那这里他是有什么特殊用意吗?我们接下来分析struct{}的作用。

struct{} 空结构是没有字段的结构类型。下面看示例:

type Demo struct{}
var demo struct{}

上面定义了一个Demo的结构体,var 声明变量demo结构体。

width

在介绍空结构前,先来讨论一下这个width
这里说的这个“width”来自于 gc 编译器,它描述类型实例占用的存储字节数(一个字节=8位)。width是类型的一个属性。由于 Go 程序中的每个值都有一个类型,因此该值的width由其类型定义,并且始终是 8 位的倍数

我们可以使用unsafe.Sizeof()函数获取任何值的width:

var num int
var str string
fmt.Println(unsafe.Sizeof(num)) // output: 8 
fmt.Println(unsafe.Sizeof(str)) // output: 16

数组类型的width是其元素类型的倍数:

var arr [3]uint32
fmt.Println(unsafe.Sizeof(arr))

结构体提供了一种更灵活的方式来定义复合类型,其width是组成类型的width加上填充的总和:

type Test struct { 
        num16 uint16 
        num32 uint32 
} 
var test Test 
fmt.Println(unsafe.Sizeof(test)) // 打印 8,而不是 6

打印结果是8,这个就和内存对齐有关系了,这里不作详细的说明。

struct{}:

空结构体的字节占用是多少呢,通过下面的例子打印得到结果:

var s struct{} 
fmt.Println(unsafe.Sizeof(s)) // 打印 0

由于空结构体占用 零字节,因此它不需要任何的填充。所以,struct{}空结构组成的结构也不会占用任何存储空间。

type S struct { 
        A struct{} 
        B struct{} 
} 
var s S 
fmt.Println(unsafe.Sizeof(s)) // 打印 0

使用场景

  • 可以声明一个数组structs{},它们当然也是一样不会占用存储空间。
var arr [100000]struct{} 
fmt.Println(unsafe.Sizeof(arr)) // 打印 0
  • struct{}类型的切片只会占用其SliceHeader的空间:
var arr = make([]struct{}, 1000000000) 
fmt.Println(unsafe.Sizeof(arr)) // 打印 24

但是我们任然可以对这个切片正常操作:

var x = make([]struct{}, 100) 
var y = x[:50] 
fmt.Println(len(y), cap(y)) // 打印 50 100
  • struct{}是可寻址时,也一样可以获取它的地址:
var test struct{} 
var data = &test

当两个不同变量相同数据类型的时候,他们两个的地址是等的:

var a, b struct{} 
fmt.Println(&a == &b) // true

但是下面两个变量是不一样的:

a := make([]struct{}, 10) 
b := make([]struct{}, 20) 
fmt.Println(&a == &b) // false, a 和 b 是不同的切片
fmt.Println(&a[0] == &b[0]) // true,它们的支持数组是相同的

总结

所以通过上面的分析,空结构体在内存上不占用资源,因此,我们在开发的时候可以通过chan struct{}来实现 go 协程之间信号的传递等用途。

转载:风向阅读 - Golang空结构体struct{}的作用?
地址:https://www.aiweimeng.top/archives/42.html文章来源地址https://www.toymoban.com/news/detail-502731.html

到了这里,关于Golang空结构体struct{}的作用?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Golang】Golang进阶系列教程--为什么 Go 语言 struct 要使用 tags

    在 Go 语言中,struct 是一种常见的数据类型,它可以用来表示复杂的数据结构。在 struct 中,我们可以定义多个字段,每个字段可以有不同的类型和名称。 除了这些基本信息之外,Go 还提供了 struct tags,它可以用来指定 struct 中每个字段的元信息。 在本文中,我们将探讨为什

    2024年02月15日
    浏览(80)
  • Golang 中的 io 包详解(五):结构体类型介绍

    实现了 io.Reader 接口,并且进行了功能扩展。R 表示 io.Reader 对象,N 表示最多允许读取的字节数。简单示例如下所示: 当读取的字节数超过限制时,LimitedReader 会自动终止读取并返回一个 io.EOF 错误,表示已经达到了总字节数的限制。 实现了 io.Reader、io.ReaderAt 和 io.Seeker 接口

    2024年02月08日
    浏览(46)
  • golang 多个struct 转换融合为一个json,平级融合或者多级融合

    1. 平级融合,就是下面例子,虽然A在B里面,但是A在struct B里面没有名字,输出结果就是A 和B在同一级的json下面。 输出:{\\\"name\\\":\\\"new name\\\",\\\"description\\\":\\\"desc\\\",\\\"url\\\":\\\"https://example.com\\\"} 2. 两级json, 输出:{\\\"name\\\":\\\"new name\\\",\\\"Adata\\\":{\\\"name\\\":\\\"test\\\",\\\"description\\\":\\\"desc\\\",\\\"url\\\":\\\"https://example.com\\\"}}

    2024年02月09日
    浏览(43)
  • golang-gin-mysql转gorm-struct--gen-model

    背景 :python-django项目用go-gin重构,数据库已存在,gin中使用gorm 所以需要工具将mysql数据库中的表结构转到orm的model中。 前提:因为国内访问github需要稳定的代理 Goproxy.cn  推荐这个 1.在项目路径中下载gen-model模块  go get -u github.com/DaoYoung/gen-model # GOBIN 目录下会有一个gen-model

    2024年02月09日
    浏览(38)
  • 【C语言】struct结构体

    具有相同或不同类型元素的集合叫做结构体。定义一个结构体,本质是在制作一个类型: 在C中,结构体内只能存放各种类型的变量,不能存函数: 像上面这样就是声明了一个结构体 struct Student ,此时的 struct Student 相当于一个类型名。 然后我们可以用这个自己声明的结构体

    2024年02月03日
    浏览(59)
  • C#: 结构体 struct 应用笔记

    说明:记录 在 C# 中的一些结构体相关的应用         在下面的示例中,在struct中定义了一个固定长度为 8 的 byte 数组 data 。通过使用 MarshalAsAttribute 的 UnmanagedType.ByValArray 参数,指定了数组的类型为值类型数组,并使用 SizeConst 字段指定了数组的大小为 8。请注意,使用固

    2024年01月17日
    浏览(51)
  • Go语言入门6(struct 结构体)

    ​结构体是一种聚合的数据类型,是由零个或多个任意类型的值聚合成的实体。每个值称为结构体的成员 type + 结构体名 + struct + {成员列表} ​⭐如果结构体成员名字是以大写字母开头的,那么该成员就是导出的。这是Go语言导出规则决 定的。一个结构体可能同时包含导出和

    2023年04月12日
    浏览(43)
  • Rust 数据类型 之 结构体(Struct)

    目录 结构体(Struct) 定义与声明 结构体定义 结构体实例 结构体分类 单元结构体(Unit Struct) 元组结构体(Tuple Struct) 具名结构体(Named Struct) 结构体嵌套 结构体方法 例1:结构体转换为字符串描述 例2:矩形的周长和面积 例3:结构体字段的更新与输出 关联函数 结构体

    2024年02月16日
    浏览(53)
  • go struct结构体之间的转换

    原文链接:https://www.zhoubotong.site/post/94.html 说下背景吧,大家在开发中可能在不同的目录(package)下定义了相同的struct(属性参数完全一样如名字、个数和类型),在方法调用传参数的时候,可能是用到了其中某一个struct的引用。 那么这里就牵扯到相互间的转换:直接上demo: 显然

    2023年04月17日
    浏览(49)
  • 【go语言基础】结构体struct

    主要是敲代码,敲的过程中会慢慢体会。 结构体是用户定义的类型,表示若干字段的集合,目的是将数据整合在一起。 简单的说,类似Java中的实体类。存储某个实体属性的集合。 注意:结构体名字,结构体属性名的首字母大写代表其余的包可以访问该结构体,类似Java中的

    2024年02月13日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包