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