Go 空结构体 struct{} 的使用

struct是Go中的关键字,用于定义结构类型。
例如:

type User struct {
    Name string
    Age  int
}

struct {}

struct {}是一个无元素的结构体类型,通常在没有信息存储时使用。优点是大小为0,不需要内存来存储struct {}类型的值。

struct {} {}

struct {} {}是一个复合字面量,它构造了一个struct {}类型的值,该值也是空。

unsafe.Sizeof
package main

import (
    "fmt"
    "unsafe"
)

func main() {
    fmt.Println(unsafe.Sizeof(struct{}{})) 
}
E:\go\src\learngolang\emptyStruct>go run main.go
0

也就是说空结构体实例不占用任何内存空间。

空结构体的作用

1. 实现集合set

Go 语言标准库没有提供 Set 的实现,通常使用 map 来代替。事实上,对于集合来说,只需要 map 的键,而不需要值。

map[string]struct{}
_, ok := map["key"]map[string]struct{}map[string]bool
type Set map[string]struct{}

func (s Set) Has(key string) bool {
    _, ok := s[key]
    return ok
}

func (s Set) Add(key string) {
    s[key] = struct{}{}
}

func (s Set) Delete(key string) {
    delete(s, key)
}

func main() {
    s := make(Set)
    s.Add("Tom")
    s.Add("Sam")
    fmt.Println(s.Has("Tom"))
    fmt.Println(s.Has("Jack"))
}

2 不发送数据的信道(channel)

struct{}

3 仅包含方法的结构体

在部分场景下,结构体只包含方法,不包含任何的字段。这时候我们就可以使用空结构体。

type calculateInt struct{} 

func (c calculateInt) add(x,y int) int {
    return x+y
}
func (c calculateInt) sub(x,y int) int {
    return x-y
}
type calculateInt bool