新手请教写 go 时常用数据结构怎么办

2019-05-22 09:05:23 +08:00
 hardwork

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

5784 次点击
所在节点    Go 编程语言
27 条回复
Moker
2019-05-22 09:31:36 +08:00
如果不在意数据持久性的话 channel 可考虑一下
mengzhuo
2019-05-22 09:39:30 +08:00
同一楼:chan 不就是 queue 么?
还自带线程安全,buffer,select 等语言特性
hoiyd
2019-05-22 09:43:35 +08:00
slice 就可以当简单的 queue 用,不知道能不能满足你的场景
jeremaihloo
2019-05-22 09:47:55 +08:00
为什么不用 chan ?
yiplee
2019-05-22 09:58:55 +08:00
搜 golang data structures,github 上有常用的结构的 go 实现
lance6716
2019-05-22 10:53:39 +08:00
刷刷 leetcode 就好了
snowwalf
2019-05-22 10:57:47 +08:00
chan + interface,万物皆可入队列
usingnamespace
2019-05-22 11:00:11 +08:00
@lance6716 人家就是问一些具体的数据结构在 go 里一般怎么用 你 leetcode 用 go 写真的很不合适 我写过一段时间 对于写算法题缺少一些算法题经常要用的 说个最基本的 库里没有实现 max 这样的函数 因为确实平时要用自己实现就好了 毕竟 go 没有重载 官方就这样考虑的 但是再刷算法题每次还要自己去多写个这样的真的是很没必要 除了有的题目用用协程 真的很没必要 不适合刷算法题 算法题还是 cpp 和 java
usingnamespace
2019-05-22 11:07:04 +08:00
@mengzhuo 有时候只想用一个纯粹的普通队列时用 channel 是愚蠢的 官方说的 Channel 底层多做了普通队列外的太多开销 毕竟本来就不是当纯粹的队列用的 slices 当队列就很好啊 也没必要再封装什么 虽然这个队列没有 cpp 和 java 中的结构那样直接用方法 但是完全 ok go 官方就不认为这是个事 项目里实在需要可以自己封装一个结构 如果偶尔用到的话就用 slice 就很好了
fatedier
2019-05-22 11:10:24 +08:00
"container/list"
"container/heap"
skadi
2019-05-22 11:11:38 +08:00
我才用 golang 手打了线段树,用来价格预警.
reus
2019-05-22 11:39:26 +08:00
lance6716
2019-05-22 11:46:26 +08:00
@usingnamespace 人家不是问一些具体的数据结构在 go 里一般怎么用,而是怎么实现。这当然是看看 leetcode 上大家都是怎么实现的。

另外不懂官方库缺少常用函数为啥就不能自己实现了,cpp 还没有 string.split 呢
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 进行类型转换
}
reus
2019-05-22 12:37:14 +08:00
enqueue: append(queue, elem)
dequeue: elem = queue[len(queue)-1]; queue = queue[:len(queue)-1]

例如队列,最简单就这样实现了,一般都用不上第三方的库
reus
2019-05-22 12:38:01 +08:00
写成栈了……随便了,都懂的
reus
2019-05-22 12:50:13 +08:00
enqueue: append(queue, elem)
dequeue: elem, queue = queue[0], queue[1:]

以前这样写会让底层的 array 不断增长,现在不会了,放心用
hardwork
2019-05-22 12:50:47 +08:00
谢谢大家,有点明白了
carlclone
2019-05-22 13:34:15 +08:00
看 LeetCode discuss 很多解答都是操作切片实现 , 不过我还是习惯自己实现个结构体
azuki
2019-05-22 13:51:34 +08:00
@reus 这样,我看到这种写法一直担心 array 太多

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/566422

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX