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-05-22 09:05:23 +08:00 · 5912 次点击
    这是一个创建于 2016 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    另外不懂官方库缺少常用函数为啥就不能自己实现了,cpp 还没有 string.split 呢
    bwangel
        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 进行类型转换
    }
    reus
        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]

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

    以前这样写会让底层的 array 不断增长,现在不会了,放心用
    hardwork
        18
    hardwork  
    OP
       2019-05-22 12:50:47 +08:00 via Android
    谢谢大家,有点明白了
    carlclone
        19
    carlclone  
       2019-05-22 13:34:15 +08:00
    看 LeetCode discuss 很多解答都是操作切片实现 , 不过我还是习惯自己实现个结构体
    azuki
        20
    azuki  
       2019-05-22 13:51:34 +08:00 via Android
    @reus 这样,我看到这种写法一直担心 array 太多
    yvescheung
        21
    yvescheung  
       2019-05-22 14:25:47 +08:00
    Golang container 包中有堆,链表,环的数据结构,链表可以作为队列,可以看一看
    hardwork
        22
    hardwork  
    OP
       2019-05-22 14:42:08 +08:00
    @reus 很简洁
    galahadv2
        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, …
    fengjianxinghun
        24
    fengjianxinghun  
       2019-05-22 16:48:42 +08:00
    interface{}都类型安全不了,这些容器类没有范型都是残废啊。。
    usingnamespace
        25
    usingnamespace  
       2019-05-22 20:36:36 +08:00 via iPhone
    @lance6716 我说了可以啊 就刷题而言 go 缺少的比 cpp 多 go 库的完善不体现在刷题所需要的这些东西上 你这种说法真的是。。。那用 c 的刷题话自己写一个红黑树实现 map 用呗??
    littlewing
        26
    littlewing  
       2019-05-22 22:47:25 +08:00 via iPhone
    go 啥时候有泛型就好了,interface{}是在太难用
    dabaibai
        27
    dabaibai  
       2019-05-23 20:07:16 +08:00
    chan 定长
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5691 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 03:37 · PVG 11:37 · LAX 19:37 · JFK 22:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.