想到两种用法
- 作value,用于map或者channel,节省点内存
- 作key,用于context中找value,作为唯一的key
举几个例子
利用map去重
package main
import "fmt"
func main() {
fmt.Printf("%s", sliceUnique([]byte("aabbcc")))
// output: abc
}
func sliceUnique(origin []byte) (unique []byte) {
filter := map[byte]struct{}{}
for _, b := range origin {
if _, ok := filter[b]; !ok {
filter[b] = struct{}{}
unique = append(unique, b)
}
}
return
}
当作channel消息
package main
import (
"fmt"
"time"
)
func main() {
done := make(chan struct{}, 1)
go func() {
// 做第一个任务
time.Sleep(time.Second)
done <- struct{}{}
}()
// 另外的任务
time.Sleep(time.Millisecond * 500)
// 等待第一个任务完成
<-done
fmt.Println("完成")
}
func sliceUnique(origin []byte) (unique []byte) {
filter := map[byte]struct{}{}
for _, b := range origin {
if _, ok := filter[b]; !ok {
filter[b] = struct{}{}
unique = append(unique, b)
}
}
return
}
当作context的Key
package main
import (
"context"
"fmt"
)
type ctxKey struct{}
func main() {
ctx := context.WithValue(context.Background(), &ctxKey{}, "Hello empty struct")
fmt.Println(getValue(ctx))
// output: Hello empty struct
}
func getValue(ctx context.Context) string {
return ctx.Value(&ctxKey{}).(string)
}
原理是每个空结构体取地址后的值是唯一的。