Golang Go语言中新手请教写常用数据结构怎么办

发布于 1周前 作者 yuanlaile 来自 Go语言

Golang Go语言中新手请教写常用数据结构怎么办

比如队列这种,像 c++的 queue,c 语言也没有,一般就用第三方基础数据结构。那么 go 呢,一般项目实践中是怎么弄的?也自己弄一个吗,或者数组代替,或者有稳定的第三方包可用?新手问题,见笑了。

28 回复

如果不在意数据持久性的话 channel 可考虑一下

更多关于Golang Go语言中新手请教写常用数据结构怎么办的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


同一楼:chan 不就是 queue 么?
还自带线程安全,buffer,select 等语言特性

slice 就可以当简单的 queue 用,不知道能不能满足你的场景

为什么不用 chan ?

搜 golang data structures,github 上有常用的结构的 go 实现

刷刷 leetcode 就好了

chan + interface,万物皆可入队列

人家就是问一些具体的数据结构在 go 里一般怎么用 你 leetcode 用 go 写真的很不合适 我写过一段时间 对于写算法题缺少一些算法题经常要用的 说个最基本的 库里没有实现 max 这样的函数 因为确实平时要用自己实现就好了 毕竟 go 没有重载 官方就这样考虑的 但是再刷算法题每次还要自己去多写个这样的真的是很没必要 除了有的题目用用协程 真的很没必要 不适合刷算法题 算法题还是 cpp 和 java

有时候只想用一个纯粹的普通队列时用 channel 是愚蠢的 官方说的 Channel 底层多做了普通队列外的太多开销 毕竟本来就不是当纯粹的队列用的 slices 当队列就很好啊 也没必要再封装什么 虽然这个队列没有 cpp 和 java 中的结构那样直接用方法 但是完全 ok go 官方就不认为这是个事 项目里实在需要可以自己封装一个结构 如果偶尔用到的话就用 slice 就很好了

“container/list”
“container/heap”

我才用 golang 手打了线段树,用来价格预警.

人家不是问一些具体的数据结构在 go 里一般怎么用,而是怎么实现。这当然是看看 leetcode 上大家都是怎么实现的。

另外不懂官方库缺少常用函数为啥就不能自己实现了,cpp 还没有 string.split 呢

https://github.com/emirpasic/gods
https://github.com/arnauddri/algorithms

Go 没有像 C++ 那样的模板,所以数据接口里面存的数据基本都是 Interface {}

可以在 https://github.com/arnauddri/algorithms/blob/master/data-structures/queue/queue.go 这个基础上再包裹一个 Queue

type UserQueue struct {
gods.Queue
}

func (uq *UserQueue) Peek() User {
el := uq.Queue.Peek()

// 对 el 进行类型转换
}

enqueue: append(queue, elem)
dequeue: elem = queue[len(queue)-1]; queue = queue[:len(queue)-1]

例如队列,最简单就这样实现了,一般都用不上第三方的库

写成栈了……随便了,都懂的

enqueue: append(queue, elem)
dequeue: elem, queue = queue[0], queue[1:]

以前这样写会让底层的 array 不断增长,现在不会了,放心用

谢谢大家,有点明白了

看 LeetCode discuss 很多解答都是操作切片实现 , 不过我还是习惯自己实现个结构体

这样,我看到这种写法一直担心 array 太多

Golang container 包中有堆,链表,环的数据结构,链表可以作为队列,可以看一看

https://github.com/emirpasic/gods 是一个用 Go 实现的各种数据结构和算法的 package。功能很全面。

GoDS (Go Data Structures). Containers (Sets, Lists, Stacks, Maps, Trees), Sets (HashSet, TreeSet, LinkedHashSet), Lists (ArrayList, SinglyLinkedList, DoublyLinkedList), Stacks (LinkedListStack, ArrayStack), Maps (HashMap, TreeMap, HashBidiMap, TreeBidiMap, LinkedHashMap), Trees (RedBlackTree, AVLTree, BTree, BinaryHeap), Comparators, Iterators, …

interface{}都类型安全不了,这些容器类没有范型都是残废啊。。

我说了可以啊 就刷题而言 go 缺少的比 cpp 多 go 库的完善不体现在刷题所需要的这些东西上 你这种说法真的是。。。那用 c 的刷题话自己写一个红黑树实现 map 用呗??

go 啥时候有泛型就好了,interface{}是在太难用

在Go语言中,构建常用数据结构是学习过程中的重要一环。作为新手,你可以从以下几种基础数据结构入手:

  1. 数组和切片(Slices):数组是固定长度的,而切片则提供了动态数组的功能,非常灵活。你可以通过make函数或字面量来创建切片,并使用内置的append函数来动态添加元素。

  2. 映射(Maps):映射类似于其他语言中的哈希表或字典,允许你存储键值对。使用make函数可以创建映射,并通过键来访问或修改值。

  3. 链表:虽然Go的标准库中没有直接提供链表,但你可以自己实现一个。链表节点可以包含数据和指向下一个节点的指针。

  4. 栈和队列:这些数据结构可以通过切片或链表来实现。栈是后进先出(LIFO)的,而队列是先进先出(FIFO)的。

  5. 树结构:包括二叉树、平衡二叉搜索树(如AVL树、红黑树)等。虽然实现这些结构可能较为复杂,但它们对于理解数据结构和算法非常有帮助。

建议从简单的数组和切片开始,逐步过渡到更复杂的结构。你可以通过编写小的程序来练习,比如实现一个基本的计算器、管理一个学生信息的系统等。同时,阅读Go语言的官方文档和社区提供的教程也是快速提升的好方法。记得多动手实践,不断积累经验。

回到顶部