怎么用golang实现一个简易版c++的FIFO队列?

什么是消息队列?

  • 消息队列(Message Queue)是一种在不同应用程序或组件之间进行异步通信的中间件技术。它主要用于解耦系统中的各个组件,使得它们可以独立地运行和扩展,同时提高系统的可靠性和性能。

  • 消息队列的工作原理是,发送者将消息发送到队列中,接收者从队列中获取消息进行处理。发送者和接收者不需要直接相互通信,它们只需要与消息队列进行交互。这样可以避免发送者和接收者之间的直接依赖,提高系统的灵活性和可维护性。

  • 消息队列通常具有以下特点:

    • 异步通信:发送者不需要等待接收者处理完消息后再进行下一步操作,可以立即返回继续执行其他任务。
    • 解耦:系统中的各个组件之间不需要直接相互通信,只需要与消息队列进行交互,从而降低了组件之间的耦合度。
    • 可靠性:消息队列通常会将消息持久化存储,确保消息不会丢失。即使接收者出现故障,消息也可以在接收者恢复后继续被处理。
    • 可扩展性:可以根据系统的负载情况动态地增加或减少消息队列的消费者数量,提高系统的吞吐量。

用Golang怎么实现?

  • 废话不多说,直接上代码(复制可直接使用)
package main

import "fmt"

type queue[T any] struct {
	capacity int32
	size     int32
	ch       chan T
}

func NewQueue[T any](capacity int32) *queue[T] {
	q := new(queue[T])
	q.Init(capacity)
	return q
}

func (q *queue[T]) Init(capacity int32) {
	q.capacity = capacity
	q.size = 0
	q.ch = make(chan T, capacity)
}

func (q *queue[T]) Push(v T) {
	if q.size == q.capacity {
		fmt.Println("触发扩容")
		nch := make(chan T, 2*q.capacity)
		for i := int32(0); i < q.size; i++ {
			nch <- <-q.ch
		}
		q.ch = nch
		q.capacity *= 2
	}
	q.ch <- v
	q.size += 1
}

func (q *queue[T]) Pop() *T {
	if q.size == 0 {
		return nil
	}
	q.size -= 1
	v := <-q.ch
	if q.size == q.capacity/2 {
		fmt.Println("触发缩容")
		nch := make(chan T, q.capacity/2)
		for i := int32(0); i < q.size; i++ {
			nch <- <-q.ch
		}
		q.ch = nch
		q.capacity /= 2
	}
	return &v
}

func (q *queue[T]) Size() int32 {
	return q.size
}

type test struct {
	I int32
}

func main() {
	// 封装一个队列数据结构,push,pop
	//Queue.Init(2)
	q := NewQueue[int32](2)
	q.Push(1)
	q.Push(2)
	q.Push(3)
	q.Push(4)
	q.Push(5)

	fmt.Println(q.Pop())
	fmt.Println(q.Pop())
	fmt.Println(q.Pop())
	fmt.Println(q.Pop())

	q1 := NewQueue[test](2)
	q1.Push(test{1})
	q1.Push(test{2})
	q1.Push(test{3})
	q1.Push(test{4})
	q1.Push(test{5})

	fmt.Println(q1.Pop())
	fmt.Println(q1.Pop())
	fmt.Println(q1.Pop())
	fmt.Println(q1.Pop())
}
  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GoppViper

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值