MST

星途 面试题库

面试题:Go中接口与通道整合之基础应用

请编写一个Go程序,创建一个接口`Worker`,有一个方法`DoWork`。再创建一个结构体`TaskWorker`实现该接口。使用通道将`TaskWorker`实例传递给另一个函数,并在该函数中调用`DoWork`方法,简述这样做的好处和适用场景。
18.1万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
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)
}

好处

  1. 解耦与灵活性:通过接口和通道,不同部分的代码之间耦合度降低。发送方只需要将实现了Worker接口的实例发送到通道,接收方从通道获取实例并调用DoWork方法,双方不需要知道彼此具体实现细节,方便代码的维护和扩展。
  2. 并发安全:通道是Go语言中用于实现并发安全通信的重要工具。在多线程或多协程环境下,使用通道传递TaskWorker实例可以避免共享资源的竞争问题,保证程序的正确性。

适用场景

  1. 任务队列:在一个任务队列系统中,生产者将任务(实现了Worker接口的实例)发送到通道,消费者从通道中取出任务并执行DoWork方法,实现任务的异步处理。
  2. 分布式系统:在分布式系统中,不同节点可能需要执行不同类型的任务,通过通道可以将任务在不同节点间传递并执行,实现分布式的工作负载均衡。