💬

Go言語のチャネルで空のデータを送受信したいときは構造体を使うと良い

2022/06/06に公開

概要

Go言語において空の構造体はメモリサイズが0であるという特徴があります。
この特徴を利用したい瞬間がいくつかあるため紹介しようと思います。

並行処理

Go言語で並行処理を行う際、とくにデータを送る必要はないが信号を送りたいというタイミングがあります。
そういった場合には空の構造体が良く使われます。

package main

import "fmt"

func send(ch chan<- struct{}) {
 ch <- struct{}{}
 ch <- struct{}{}
 close(ch)
}

func main() {
 ch := make(chan struct{})

 go send(ch)

 for c := range ch {
  fmt.Println("receive : ", c)
 }
}

当然、空の構造体を送受信しているだけなので出力は下記のようなものです。

{}
{}

空の構造体はメモリサイズが0であるためパフォーマンス的にも優れています。

mapへの代入

Go言語では配列内に特定の要素が含まれているかという判定を行うことがすぐにはできません。
同様のサイズのmapを用意しそちらに空の構造体を代入しておくことで記録をしておくと便利です。

func uniq(target []string) []string {
 result := make([]string, 0, len(target))
 seen := make(map[string]struct{}, len(target))

 for _, item := range target {
  if _, ok := seen[item]; ok {
   continue
  }

  seen[item] = struct{}{}
  result = append(result, item)
 }

 return result
}
GitHubで編集を提案

Discussion