Go实现List、Set、Stack、Deque等数据结构

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在设计上做了很多取舍。

  1. 简单性:Go语言团队的一个核心目标是保持语言的简单性。他们认为,如果一个功能可以用简单的组合来实现,那就没有必要把它放进标准库里。
    deque、stack、set、list这些数据结构虽然常用,但它们并不是编写高效、可维护代码的唯一途径。通过组合切片和映射,开发者可以实现绝大多数需要的数据结构。

  2. 鼓励最佳实践:Go语言推崇一种“最小惊奇”的设计原则。也就是说,代码应该尽可能地容易理解和预测。标准库的设计哲学之一就是提供最少但足够的工具,让开发者能够按照最佳实践来编写代码。
    这个哲学避免了标准库的膨胀,同时确保了代码的清晰性和可维护性。

  3. 社区的力量: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{
   
   }
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值