Golang中除了containers(heap/ring/list)还有其他核心包吗?

Golang中除了containers(heap/ring/list)还有其他核心包吗? 大家好,

我最近阅读了 container/heapcontainer/ringcontainer/list 包的代码。它们非常有用,并且随 Go 源代码一同发布。

在 Go 核心源代码中,是否还有其他类似的数据结构实现可以找到(并使用)?

我更感兴趣的是 Go 源代码本身,而不是可以从互联网导入的、包含数据结构/算法的自定义包。

5 回复

我猜这是因为这些是最常需要的,也许还因为Go团队在编译器或运行时代码(如垃圾回收器)中需要它们。

更多关于Golang中除了containers(heap/ring/list)还有其他核心包吗?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


不,标准库中没有其他类似的包。

请注意,这些并不是数据结构。它们只是应用于用户提供的数据结构上的算法。 用户的数据结构需要提供修改该数据结构的原始函数。

此外,由于多种原因,它们后来被认为是一个糟糕的想法(链表被认为对缓存局部性有害,同样地,interface{} 类型的容器也是如此)。

@Christophe_Meessen

感谢您的快速回复。我理解 ring/list/heap 这些包介于数据结构和算法之间,或许更偏向算法而非数据结构。我仍然称它们为数据结构,因为它们实现了同名的抽象数据结构。

在标准库中,我们为什么没有找到更多这样的包呢?这似乎有点奇怪。我的意思是,为什么他们只放了这些,而没有更多呢?

是的,Go 标准库中除了 container 包,还有其他核心包提供了重要的数据结构实现。以下是几个关键的包及其数据结构:

  1. sync.Map(并发安全映射)
    位于 sync 包中,适用于高并发读写场景。
    示例:

    package main
    import (
        "fmt"
        "sync"
    )
    func main() {
        var m sync.Map
        m.Store("key1", "value1")
        if v, ok := m.Load("key1"); ok {
            fmt.Println(v) // 输出: value1
        }
    }
    
  2. strings.Builder(高效字符串构建)
    位于 strings 包中,用于拼接字符串,避免内存复制。
    示例:

    package main
    import (
        "fmt"
        "strings"
    )
    func main() {
        var b strings.Builder
        b.WriteString("Hello")
        b.WriteString(" World")
        fmt.Println(b.String()) // 输出: Hello World
    }
    
  3. bytes.Buffer(字节缓冲区)
    位于 bytes 包中,提供可变的字节缓冲区,支持读写操作。
    示例:

    package main
    import (
        "bytes"
        "fmt"
    )
    func main() {
        var buf bytes.Buffer
        buf.WriteString("data")
        fmt.Println(buf.String()) // 输出: data
    }
    
  4. sort 包中的排序接口
    虽然不是传统数据结构,但 sort.Interface 允许对任意切片进行排序。
    示例:

    package main
    import (
        "fmt"
        "sort"
    )
    func main() {
        nums := []int{3, 1, 4, 1, 5}
        sort.Ints(nums)
        fmt.Println(nums) // 输出: [1 1 3 4 5]
    }
    

这些包都是 Go 标准库的一部分,直接随 Go 发行,无需额外导入第三方代码。

回到顶部