MST

星途 面试题库

面试题:Go语言中切片在复合数据类型设计模式中的应用

在Go语言中,假设你要实现一个简单的任务队列,使用切片作为底层数据结构来存储任务。请编写代码实现向任务队列添加任务(`AddTask`函数)和从任务队列取出任务(`GetTask`函数),并考虑并发安全问题。
25.4万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

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