Golang中是否需要增加更多通用数据结构?

Golang中是否需要增加更多通用数据结构? 一些常见的数据结构并未包含在标准库中,例如栈、队列和双端队列……切片虽然好用但不够便捷。

6 回复

我没有找到相关的讨论……但我现在可能明白了,容器列表可以很好地替代我提到的数据结构。谢谢!

更多关于Golang中是否需要增加更多通用数据结构?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


关于这个问题已经有过讨论,但通常使用切片并为其添加一些方法会是更好的选择。

哎呀,是的,标准库。 当然,第三方库是一种解决方案。但我不明白为什么标准库不包含这些常见的数据结构。

我认为 container/list 是一个很好的例子,说明了为什么标准库中没有更多数据结构。它效率低下且完全不安全。一旦泛型出现,情况可能会改变。在此之前,自定义类型是你的朋友。

你在说什么?哪个包?你是指标准库吗?

也许这里有一个适合你的第三方库:

GitHub

avelino/awesome-go

头像

一个精心整理的优秀 Go 框架、库和软件列表 - avelino/awesome-go

在Go语言中,标准库确实没有提供显式的栈、队列或双端队列等通用数据结构。这主要是因为Go的设计哲学强调简洁性和明确性,鼓励开发者根据具体需求使用切片或通道来实现这些结构。不过,社区中已经有一些优秀的第三方库(如container/listcontainer/ring)可以部分满足需求,但功能可能不够全面。

以下是一些示例代码,展示如何使用切片实现栈和队列:

  1. 使用切片实现栈
package main

import "fmt"

type Stack []int

func (s *Stack) Push(v int) {
    *s = append(*s, v)
}

func (s *Stack) Pop() int {
    if len(*s) == 0 {
        return -1 // 或返回错误
    }
    v := (*s)[len(*s)-1]
    *s = (*s)[:len(*s)-1]
    return v
}

func main() {
    var s Stack
    s.Push(1)
    s.Push(2)
    fmt.Println(s.Pop()) // 输出: 2
}
  1. 使用切片实现队列
package main

import "fmt"

type Queue []int

func (q *Queue) Enqueue(v int) {
    *q = append(*q, v)
}

func (q *Queue) Dequeue() int {
    if len(*q) == 0 {
        return -1 // 或返回错误
    }
    v := (*q)[0]
    *q = (*q)[1:]
    return v
}

func main() {
    var q Queue
    q.Enqueue(1)
    q.Enqueue(2)
    fmt.Println(q.Dequeue()) // 输出: 1
}

对于双端队列,可以使用container/list包:

package main

import (
    "container/list"
    "fmt"
)

func main() {
    deque := list.New()
    deque.PushBack(1)  // 从尾部添加
    deque.PushFront(2) // 从头部添加
    fmt.Println(deque.Front().Value) // 输出: 2
}

虽然这些实现方式足够简单直接,但在性能敏感的场景中可能需要更优化的方案。社区中也有一些第三方库(如github.com/golang-collections/collections)提供了更丰富的数据结构,但标准库的简洁性确实可能导致在某些情况下需要额外的工作。

回到顶部