新手请教写 go 时常用数据结构怎么办 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
hardwork
V2EX    Go 编程语言

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

  •  
  •   hardwork 2019 年 5 月 22 日 6488 次点击
    这是一个创建于 2492 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    另外不懂官方库缺少常用函数为啥就不能自己实现了,cpp 还没有 string.split 呢
    bwangel
        14
    bwangel  
       2019 年 5 月 22 日
    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
        15
    reus  
       2019 年 5 月 22 日
    enqueue: append(queue, elem)
    dequeue: elem = queue[len(queue)-1]; queue = queue[:len(queue)-1]

    例如队列,最简单就这样实现了,一般都用不上第三方的库
    reus
        16
    reus  
       2019 年 5 月 22 日
    写成栈了……随便了,都懂的
    reus
        17
    reus  
       2019 年 5 月 22 日   1
    enqueue: append(queue, elem)
    dequeue: elem, queue = queue[0], queue[1:]

    以前这样写会让底层的 array 不断增长,现在不会了,放心用
    hardwork
        18
    hardwork  
    OP
       2019 年 5 月 22 日 via Android
    谢谢大家,有点明白了
    carlclone
        19
    carlclone  
       2019 年 5 月 22 日
    看 LeetCode discuss 很多解答都是操作切片实现 , 不过我还是习惯自己实现个结构体
    azuki
        20
    azuki  
       2019 年 5 月 22 日 via Android
    @reus 这样,我看到这种写法一直担心 array 太多
    yvescheung
        21
    yvescheung  
       2019 年 5 月 22 日
    Golang container 包中有堆,链表,环的数据结构,链表可以作为队列,可以看一看
    hardwork
        22
    hardwork  
    OP
       2019 年 5 月 22 日
    @reus 很简洁
    galahadv2
        23
    galahadv2  
       2019 年 5 月 22 日
    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, …
    fengjianxinghun
        24
    fengjianxinghun  
       2019 年 5 月 22 日
    interface{}都类型安全不了,这些容器类没有范型都是残废啊。。
    usingnamespace
        25
    usingnamespace  
       2019 年 5 月 22 日 via iPhone
    @lance6716 我说了可以啊 就刷题而言 go 缺少的比 cpp 多 go 库的完善不体现在刷题所需要的这些东西上 你这种说法真的是。。。那用 c 的刷题话自己写一个红黑树实现 map 用呗??
    littlewing
        26
    littlewing  
       2019 年 5 月 22 日 via iPhone
    go 啥时候有泛型就好了,interface{}是在太难用
    dabaibai
        27
    dabaibai  
       2019 年 5 月 23 日
    chan 定长
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1416 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 17:04 PVG 01:04 LAX 10:04 JFK 13:04
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86