Go实现List、Set、Stack、Deque等数据结构
完整代码地址(欢迎大家⭐️):
https://github.com/ziyifast/ziyifast-code_instruction/tree/main/go-demo/go-data-structure
大家有接触过除Go其他语言(如:Java)可能就会想为什么Go没有像deque、stack、set、list这些常见的数据容器。尤其是对于那些习惯了用这些容器解决LeetCode问题的同学来说,就更为不便。
1 为什么Go原生不提供这些容器:为了简洁
Go语言自诞生以来就有着非常明确的目标,那就是简洁、高效、并发。为了实现这些目标,Go在设计上做了很多取舍。
-
简单性:Go语言团队的一个核心目标是保持语言的简单性。他们认为,如果一个功能可以用简单的组合来实现,那就没有必要把它放进标准库里。
deque、stack、set、list这些数据结构虽然常用,但它们并不是编写高效、可维护代码的唯一途径。通过组合切片和映射,开发者可以实现绝大多数需要的数据结构。 -
鼓励最佳实践:Go语言推崇一种“最小惊奇”的设计原则。也就是说,代码应该尽可能地容易理解和预测。标准库的设计哲学之一就是提供最少但足够的工具,让开发者能够按照最佳实践来编写代码。
这个哲学避免了标准库的膨胀,同时确保了代码的清晰性和可维护性。 -
社区的力量:Go语言的生态系统非常活跃,有很多高质量的第三方库可以提供你需要的高级数据结构。如果标准库包含了所有可能需要的数据结构,那它将变得非常庞大且难以维护。
相反,通过社区贡献,Go可以保持核心的简洁,同时又不失灵活性。
2 实现
完整代码地址:https://github.com/ziyifast/ziyifast-code_instruction/tree/main/go-demo/go-data-structure
虽然Go语言没有内置这些高级数据结构,但通过组合使用切片和映射,我们依然可以实现几乎所有需要的数据结构。
- 而且,这种方式更符合Go语言简洁、高效的设计哲学。
- 最重要的是,这也让我们更加理解这些数据结构的内部实现,而不仅仅是简单地调用现成的API。
所以,下次再遇到类似的问题,大家也可以自己试试看实现这些数据结构,既能提升编码能力,又能更深入地理解Go语言的设计理念。
List
思路:对于列表来说,通常需要有Add、Remove等操作,其实golang原生的切片就很接近切片,因此我们简单做封装即可
package main
import (
"errors"
"fmt"
)
/*
List:
- NewList(): 创建一个新的列表
- Add(element): 在列表末尾添加元素
- Remove(index): 根据索引移除元素
- Size(): 返回列表的大小
- Get(index): 根据索引获取元素
- IsEmpty(): 判断列表是否为空
- Clear(): 清空列表
- GetFirst(): 获取第一个元素
- GetLast(): 获取最后一个元素
- RemoveLast(): 移除最后一个元素
- AddFirst(element): 在列表开头添加元素
- RemoveFirst(): 移除第一个元素
...
*/
type List struct {
data []interface{
}
}
// NewList 创建一个新的列表
func NewList() *List {
return &List{
data: []interface{
}{
},
}
}
// Add 在列表末尾添加元素
func (l *List) Add(v interface{
}) {
l.data = append(l.data, v)
}
// Remove 根据索引移除元素
func (l *List) Remove(index int) error {
if index < 0 || index >= len(l.data) {
return errors.New("index out of bounds")
}
l.data = append(l.data[:index], l.data[index+1:]...)
return nil
}
// Size 返回列表的大小
func (l *List) Size() int {
return len(l.data)
}
// Get 根据索引获取元素
func (l *List) Get(index int) (interface{
}, error) {
if index < 0 || index >= len(l.data) {
return nil, errors.New("index out of bounds")
}
return l.data[index], nil
}
// IsEmpty 判断列表是否为空
func (l *List) IsEmpty() bool {
return len(l.data) == 0
}
// Clear 清空列表
func (l *List) Clear() {
l.data = []interface{
}{
}
}
// GetFirst 获取第一个元素
func (l *List) GetFirst() (interface{
}, error) {
if l.IsEmpty() {
return nil, errors.New("list is empty")
}
return l.data[0], nil
}
// GetLast 获取最后一个元素
func (l *List) GetLast() (interface{
}, error) {
if l.IsEmpty() {
return nil, errors.New("list is empty")
}
return l.data[len(l.data)-1], nil
}
// AddFirst 在列表开头添加元素
func (l *List) AddFirst(v interface{
}) {
l.data = append([]interface{
}

最低0.47元/天 解锁文章
574

被折叠的 条评论
为什么被折叠?



