An empty struct in Go has no data elements.
type S struct{}
The most important property of the empty struct is that the width is zero. This allows to create a slice or channel of thousands of empty structs with a tiny memory footprint.
Here is a size comparison of the empty struct vs empty interface vs bool:
package main
import (
"fmt"
"unsafe"
)
func main() {
var s struct{}
var i interface{}
var b bool
fmt.Println(unsafe.Sizeof(s), unsafe.Sizeof(i), unsafe.Sizeof(b))
}
On a 32 bit system: 0 8 1
On a 64-bit system:0 16 1null
Uses of empty struct
As a method receiver
An empty struct{} can be used as a method receiver in cases when you don’t need data on a struct just methods with predefined input and output. E.g. You may want have a mock for testing interfaces.
An empty struct channel
An empty struct is very useful in channels when you have to notify that some event occurred but you don’t need to pass any information about it. Using a channel of empty structure will only increment a counter in the channel but not assign memory, copy elements and so on. Using boolean values for this purpose has a memory footprint that can be avoided using the empty struct.
As a Set data type
Go has no Set data type. This can be easily emulated by using map[keyType]struct{}. This way map keeps only keys and no values.