package main
import (
"fmt"
)
// Worker接口定义
type Worker interface {
DoWork()
}
// TaskWorker结构体实现Worker接口
type TaskWorker struct{}
func (tw TaskWorker) DoWork() {
fmt.Println("TaskWorker is doing work")
}
// 接收Worker实例并调用DoWork方法的函数
func processWorker(w Worker) {
w.DoWork()
}
func main() {
taskWorker := TaskWorker{}
workerChan := make(chan Worker)
go func() {
workerChan <- taskWorker
}()
worker := <-workerChan
processWorker(worker)
}
好处
- 解耦与灵活性:通过接口和通道,不同部分的代码之间耦合度降低。发送方只需要将实现了
Worker
接口的实例发送到通道,接收方从通道获取实例并调用DoWork
方法,双方不需要知道彼此具体实现细节,方便代码的维护和扩展。
- 并发安全:通道是Go语言中用于实现并发安全通信的重要工具。在多线程或多协程环境下,使用通道传递
TaskWorker
实例可以避免共享资源的竞争问题,保证程序的正确性。
适用场景
- 任务队列:在一个任务队列系统中,生产者将任务(实现了
Worker
接口的实例)发送到通道,消费者从通道中取出任务并执行DoWork
方法,实现任务的异步处理。
- 分布式系统:在分布式系统中,不同节点可能需要执行不同类型的任务,通过通道可以将任务在不同节点间传递并执行,实现分布式的工作负载均衡。