想到两种用法

  • 作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)
}

原理是每个空结构体取地址后的值是唯一的。