介绍

听说是 Go 增强月,所以我正在写一篇关于 Go 的文章。

在 Go 中实现 Stack 或 FIFO 时使用 container/list。这个container/list 只提供堆栈和FIFO 所需的基础。这是因为 Stack 和 FIFO 的机制是一样的,唯一的区别是检索时是置顶还是置底。

Stack 在字段中有container/list,添加到末尾,然后从末尾取出。

package main

import (
	"container/list"
	"fmt"
)

type Stack struct {
	v *list.List
}

func NewStack() *Stack {
	return &Stack{v: list.New()}
}

func (s *Stack) Push(v interface{}) {
	s.v.PushBack(v)
}

func (s *Stack) Pop() interface{} {
	b := s.v.Back()
	if b == nil {
		return nil
	}
	return s.v.Remove(b)
}


func main() {
	s := NewStack()
	s.Push(1)
	s.Push(2)
	s.Push(3)
	fmt.Println(s.Pop())
	fmt.Println(s.Pop())
	fmt.Println(s.Pop())
}

先进先出

类似地,FIFO在字段中有container/list,添加到末尾,从开头取出。

package main

import (
	"container/list"
	"fmt"
)

type FIFO struct {
	v *list.List
}

func NewFIFO() *FIFO {
	return &FIFO{v: list.New()}
}

func (s *FIFO) Push(v interface{}) {
	s.v.PushBack(v)
}

func (s *FIFO) Pop() interface{} {
	b := s.v.Front()
	if b == nil {
		return nil
	}
	return s.v.Remove(b)
}

func main() {
	f := NewFIFO()
	f.Push(1)
	f.Push(2)
	f.Push(3)
	fmt.Println(f.Pop())
	fmt.Println(f.Pop())
	fmt.Println(f.Pop())
}

如果您想将其限制为 int这样的感觉。

概括

你说 Go 似乎没有 Stack 或 FIFO,但实际上它们有。顺便说一句,也可以使用chan实现FIFO。 chan 通常用于在 goroutine 中传递数据,但如果它有缓冲区,它也可以用作同一主 goroutine 中的 FIFO。

package main

import "fmt"

func main() {
    fifo := make(chan int, 5)
    fifo <- 1
    fifo <- 2
    fifo <- 3
    fmt.Println(<-fifo)
    fmt.Println(<-fifo)
    fmt.Println(<-fifo)
}


原创声明:本文系作者授权爱码网发表,未经许可,不得转载;

原文地址:https://www.likecs.com/show-308623459.html

技术点:

Go

相关文章:

  • 2021-10-27
  • 2022-02-07
  • 2022-02-07
猜你喜欢
  • 2022-01-18
  • 2022-12-23
  • 2022-12-23
  • 2021-11-27
  • 2021-12-02
相关资源
相似解决方案