golang实现队列操作

部署运行你感兴趣的模型镜像

队列和栈一样也是表。然而队列是插入在一段进行而删除在另一端进行。

队列是先进先出(FIFO)的。


下面用切片实现队列操作:

package main

import "fmt"

type Element interface{}

type Queue interface {
	Offer(e Element)    //向队列中添加元素
	Poll()   Element    //移除队列中最前面的元素
	Clear()  bool       //清空队列
	Size()  int            //获取队列的元素个数
	IsEmpty() bool   //判断队列是否是空
}

type  sliceEntry struct{
	element []Element
}

func NewQueue() *sliceEntry {
	return &sliceEntry{}
}

//向队列中添加元素
func (entry *sliceEntry) Offer(e Element) {
	entry.element = append(entry.element,e)
}

//移除队列中最前面的额元素
func (entry *sliceEntry) Poll() Element {
	if entry.IsEmpty() {
		fmt.Println("queue is empty!")
		return nil
	}

	firstElement := entry.element[0]
	entry.element = entry.element[1:]
	return firstElement
}

func (entry *sliceEntry) Clear() bool {
	if entry.IsEmpty() {
		fmt.Println("queue is empty!")
		return false
	}
	for i:=0 ; i< entry.Size() ; i++ {
			entry.element[i] = nil
	}
	entry.element = nil
	return true
}

func (entry *sliceEntry) Size() int {
	return len(entry.element)
}

func (entry *sliceEntry) IsEmpty() bool {
	if len(entry.element) == 0 {
		return true
	}
	return false
}

func main() {
	queue := NewQueue()
	for i := 0; i < 50; i++ {
		queue.Offer(i)
	}
	fmt.Println("size:",queue.Size())
	fmt.Println("移除最前面的元素:",queue.Poll())
	fmt.Println("size:",queue.Size())
	fmt.Println("清空:",queue.Clear())
	for i := 0; i < 50; i++ {
		queue.Offer(i)
	}
	fmt.Println(queue.Poll())
	fmt.Println(queue.Poll())
	fmt.Println(queue.Size())
}

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

Go语言实现多消息队列集成,可结合其优势,并针对不同消息队列的特点进行操作。 Go语言具备高效的并发处理能力,其goroutine和channel让并发编程简单高效;语法简洁,易于维护;标准库强大,减少对第三方库的依赖,这些优势有利于实现多消息队列集成[^3]。 不同消息队列有各自特点和适用场景,集成时需根据需求选择。如Kafka适用于高吞吐日志处理,RabbitMQ是企业级消息路由的选择,Redis Streams用于轻量级实时消息,RocketMQ则用于金融级可靠消息[^5]。 Go语言与RabbitMQ通信时,可根据消息队列基本组件进行操作。生产者生成消息并发送到消息队列,交换机接收消息并路由到队列,消费者从队列获取消息处理。可使用Go语言的amqp库实现与RabbitMQ通信,示例代码如下: ```go package main import ( "log" "github.com/streadway/amqp" ) func failOnError(err error, msg string) { if err != nil { log.Fatalf("%s: %s", msg, err) } } func main() { conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/") failOnError(err, "Failed to connect to RabbitMQ") defer conn.Close() ch, err := conn.Channel() failOnError(err, "Failed to open a channel") defer ch.Close() q, err := ch.QueueDeclare( "hello", // name false, // durable false, // delete when unused false, // exclusive false, // no-wait nil, // arguments ) failOnError(err, "Failed to declare a queue") body := "Hello World!" err = ch.Publish( "", // exchange q.Name, // routing key false, // mandatory false, // immediate amqp.Publishing{ ContentType: "text/plain", Body: []byte(body), }) failOnError(err, "Failed to publish a message") log.Printf(" [x] Sent %s", body) } ``` 早期基于Redis实现轻量化消息队列有3种方式,但存在缺点。若要集成Redis消息队列,需考虑这些问题,选择合适实现方式。 对于Kafka,可使用Go语言的Sarama库实现集成,示例代码如下: ```go package main import ( "fmt" "log" "github.com/Shopify/sarama" ) func main() { config := sarama.NewConfig() config.Producer.RequiredAcks = sarama.WaitForAll config.Producer.Retry.Max = 5 config.Producer.Return.Successes = true producer, err := sarama.NewSyncProducer([]string{"localhost:9092"}, config) if err != nil { log.Fatal(err) } defer producer.Close() message := &sarama.ProducerMessage{ Topic: "my_topic", Value: sarama.StringEncoder("Hello, Kafka!"), } partition, offset, err := producer.SendMessage(message) if err != nil { log.Fatal(err) } fmt.Printf("Message is stored in topic(%s)/partition(%d)/offset(%d)\n", "my_topic", partition, offset) } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值