it编程 > 前端脚本 > Golang

go语言中空结构体的实现

3人参与 2025-04-24 Golang

本文主要介绍了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)的元素类型是一种常见的优化手段。这种做法主要出于以下几个原因:

.关闭多个工作协程

package main

import (
    "fmt"
    "time"
)

func worker(id int, done chan struct{}) {
    for {
        select {
        case <-done:
            fmt.printf("worker %d shutting down\n", id)
            return
        default:
            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 main

import (
    "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.waitgroup
    done := 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 通道中的信号来确认所有任务是否已完成。

到此这篇关于go语言中空结构体的实现的文章就介绍到这了,更多相关go语言 空结构体内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

go协程池实现原理小结

04-24

go语言内存泄漏的常见形式

04-24

go语言使用range来接收通道里面的数据

04-24

Go 语言中的select语句详解及工作原理

04-24

如何使用Golang打包jar应用

04-24

Go net/http/pprof分析内存泄露及解决过程

04-24

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论