面试题答案
一键面试package main
import (
"fmt"
"sync"
)
type TaskQueue struct {
tasks []interface{}
mutex sync.Mutex
}
// AddTask 向任务队列添加任务
func (q *TaskQueue) AddTask(task interface{}) {
q.mutex.Lock()
defer q.mutex.Unlock()
q.tasks = append(q.tasks, task)
}
// GetTask 从任务队列取出任务
func (q *TaskQueue) GetTask() interface{} {
q.mutex.Lock()
defer q.mutex.Unlock()
if len(q.tasks) == 0 {
return nil
}
task := q.tasks[0]
q.tasks = q.tasks[1:]
return task
}
你可以这样使用这个任务队列:
func main() {
q := &TaskQueue{}
var wg sync.WaitGroup
// 模拟并发添加任务
for i := 0; i < 5; i++ {
wg.Add(1)
go func(num int) {
defer wg.Done()
q.AddTask(num)
}(i)
}
// 模拟并发取出任务
for i := 0; i < 5; i++ {
wg.Add(1)
go func() {
defer wg.Done()
task := q.GetTask()
if task != nil {
fmt.Println("Got task:", task)
}
}()
}
wg.Wait()
}