比如队列这种,像 c++的 queue,c 语言也没有,一般就用第三方基础数据结构。那么 go 呢,一般项目实践中是怎么弄的?也自己弄一个吗,或者数组代替,或者有稳定的第三方包可用?新手问题,见笑了。
1
Moker 2019-05-22 09:31:36 +08:00 1
如果不在意数据持久性的话 channel 可考虑一下
|
2
mengzhuo 2019-05-22 09:39:30 +08:00
同一楼:chan 不就是 queue 么?
还自带线程安全,buffer,select 等语言特性 |
3
hoiyd 2019-05-22 09:43:35 +08:00 via Android
slice 就可以当简单的 queue 用,不知道能不能满足你的场景
|
4
jeremaihloo 2019-05-22 09:47:55 +08:00
为什么不用 chan ?
|
5
yiplee 2019-05-22 09:58:55 +08:00
搜 golang data structures,github 上有常用的结构的 go 实现
|
6
lance6716 2019-05-22 10:53:39 +08:00
刷刷 leetcode 就好了
|
7
snowwalf 2019-05-22 10:57:47 +08:00
chan + interface,万物皆可入队列
|
8
usingnamespace 2019-05-22 11:00:11 +08:00 via iPhone
@lance6716 人家就是问一些具体的数据结构在 go 里一般怎么用 你 leetcode 用 go 写真的很不合适 我写过一段时间 对于写算法题缺少一些算法题经常要用的 说个最基本的 库里没有实现 max 这样的函数 因为确实平时要用自己实现就好了 毕竟 go 没有重载 官方就这样考虑的 但是再刷算法题每次还要自己去多写个这样的真的是很没必要 除了有的题目用用协程 真的很没必要 不适合刷算法题 算法题还是 cpp 和 java
|
9
usingnamespace 2019-05-22 11:07:04 +08:00 via iPhone
@mengzhuo 有时候只想用一个纯粹的普通队列时用 channel 是愚蠢的 官方说的 Channel 底层多做了普通队列外的太多开销 毕竟本来就不是当纯粹的队列用的 slices 当队列就很好啊 也没必要再封装什么 虽然这个队列没有 cpp 和 java 中的结构那样直接用方法 但是完全 ok go 官方就不认为这是个事 项目里实在需要可以自己封装一个结构 如果偶尔用到的话就用 slice 就很好了
|
10
fatedier 2019-05-22 11:10:24 +08:00
"container/list"
"container/heap" |
11
skadi 2019-05-22 11:11:38 +08:00
我才用 golang 手打了线段树,用来价格预警.
|
12
reus 2019-05-22 11:39:26 +08:00
|
13
lance6716 2019-05-22 11:46:26 +08:00
@usingnamespace 人家不是问一些具体的数据结构在 go 里一般怎么用,而是怎么实现。这当然是看看 leetcode 上大家都是怎么实现的。
另外不懂官方库缺少常用函数为啥就不能自己实现了,cpp 还没有 string.split 呢 |
14
bwangel 2019-05-22 11:49:15 +08:00
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 进行类型转换 } |
15
reus 2019-05-22 12:37:14 +08:00
enqueue: append(queue, elem)
dequeue: elem = queue[len(queue)-1]; queue = queue[:len(queue)-1] 例如队列,最简单就这样实现了,一般都用不上第三方的库 |
16
reus 2019-05-22 12:38:01 +08:00
写成栈了……随便了,都懂的
|
17
reus 2019-05-22 12:50:13 +08:00 1
enqueue: append(queue, elem)
dequeue: elem, queue = queue[0], queue[1:] 以前这样写会让底层的 array 不断增长,现在不会了,放心用 |
18
hardwork OP 谢谢大家,有点明白了
|
19
carlclone 2019-05-22 13:34:15 +08:00
看 LeetCode discuss 很多解答都是操作切片实现 , 不过我还是习惯自己实现个结构体
|
21
yvescheung 2019-05-22 14:25:47 +08:00
Golang container 包中有堆,链表,环的数据结构,链表可以作为队列,可以看一看
|
23
galahadv2 2019-05-22 16:00:41 +08:00
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, … |
24
fengjianxinghun 2019-05-22 16:48:42 +08:00
interface{}都类型安全不了,这些容器类没有范型都是残废啊。。
|
25
usingnamespace 2019-05-22 20:36:36 +08:00 via iPhone
@lance6716 我说了可以啊 就刷题而言 go 缺少的比 cpp 多 go 库的完善不体现在刷题所需要的这些东西上 你这种说法真的是。。。那用 c 的刷题话自己写一个红黑树实现 map 用呗??
|
26
littlewing 2019-05-22 22:47:25 +08:00 via iPhone
go 啥时候有泛型就好了,interface{}是在太难用
|
27
dabaibai 2019-05-23 20:07:16 +08:00
chan 定长
|