为什么在等待某些未通过“ chan interface {}”执行的操作时使用“ chan struct {}”?

In golang, when we need to wait something done, we will use a channel to wait it done.

example:

done := make(chan struct{})
go func() {
    // ...
    close(done)
}()
<-done

But, in other way, chan interface{} work fine in this case.

So, what's difference between chan struct{} and chan interface{}?

Example2:

done := make(chan struct{})
go func() {
    // ...
    done <- struct{}{}
}()
<- done

In other case, if don't close channel in goroutine instead of send object to it.

There will create an object in goroutine, but if using chan interface{}, can be send nil object to channel.

It is a better way to instead chan struct{}?

In your example of a 'done' channel, functionally speaking, the channel can be of literally any type, since no data is actually sent, and the channel is just used as a signaling mechanism. But in the interest of memory utilization, struct{} is the smallest data type available in Go, since it contains literally nothing, so no allocation necessary, which is why it's typically used in such scenarios.

The empty struct struct {} requires no memory. So if you have a channel with a large capacity you can save a few bytes by switching from make(chan bool, 1<<16) to make(struct {}, 1<<16). Using interface {} requires more space and is really strange here.

For an unbuffered done channel I think using struct {} is wrong as it is unclear. Using a simple chan bool is much more sensible. Using interface {} is completely wrong: It probably uses more space and is even less clear than struct {}.