{"id":41135478,"url":"https://github.com/xwzy/godan","last_synced_at":"2026-01-22T18:37:47.150Z","repository":{"id":57569432,"uuid":"340292564","full_name":"xwzy/godan","owner":"xwzy","description":"Skip List, Bloom Filter, Ring Buffer, Query Counter, LRU, LFU... 🚀🚀🚀 Data structures and algorithm implementation in golang. ","archived":false,"fork":false,"pushed_at":"2022-01-31T01:22:49.000Z","size":99,"stargazers_count":13,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-06-20T03:57:25.653Z","etag":null,"topics":["algorithm","algorithms-and-data-structures","data-structures","golang"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/xwzy.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-02-19T07:35:34.000Z","updated_at":"2024-06-12T16:07:03.000Z","dependencies_parsed_at":"2022-08-23T18:11:05.073Z","dependency_job_id":null,"html_url":"https://github.com/xwzy/godan","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/xwzy/godan","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xwzy%2Fgodan","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xwzy%2Fgodan/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xwzy%2Fgodan/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xwzy%2Fgodan/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/xwzy","download_url":"https://codeload.github.com/xwzy/godan/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xwzy%2Fgodan/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28668178,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-22T17:07:18.858Z","status":"ssl_error","status_checked_at":"2026-01-22T17:05:02.040Z","response_time":144,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["algorithm","algorithms-and-data-structures","data-structures","golang"],"created_at":"2026-01-22T18:37:47.066Z","updated_at":"2026-01-22T18:37:47.145Z","avatar_url":"https://github.com/xwzy.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# godan\nData structures and utils in golang.\n\n- [x] Bloom Filter (Thread Safe)\n- [x] Ring Buffer (A buffer store the most recent data) (Thread Safe)\n- [x] Counter (Count query number in a rate limiter) (Thread Safe)\n- [x] Bitmap (Thread Safe)\n- [x] Stack\n- [x] Queue\n- [x] Deque\n- [x] Vector\n- [x] Set\n- [ ] List\n- [ ] Heap / Priority Queue\n- [ ] Cache (FIFO / LRU / LFU)\n- [x] Trie (Thread Safe)\n- [ ] Skip List\n- [ ] B Tree\n- [ ] B+ Tree\n- [ ] AVL Tree\n- [ ] RBTree\n\n\u003e ⚠️⚠️  Some following examples are use default constructors for simplicity, you should specify parameters by using NewXXX().  \n\n## Bloom Filter\n\u003e 🚀 Check out murmur on [github.com/spaolacci/murmur3](github.com/spaolacci/murmur3) for a better hash function\n\n### Simple Bloom Filter for number\n```go\nimport \"github.com/xwzy/godan/bloomfilter\"\n\nfunc main() {\n    b := bloomfilter.DefaultNumberBloomFilter()\n    \n    b.Set((uint64)(100))\n    b.Exist((uint64)(100)  // true\n    b.Exist((uint64)(1124) // false\n}\n```\n\n### Simple Bloom Filter for string\n```go\nimport \"github.com/xwzy/godan/bloomfilter\"\n\nfunc main() {\n    b := bloomfilter.DefaultStringBloomFilter()\n    \n    b.Set(\"test0001\")\n    b.Exist(\"test001\") // true\n    b.Exist(\"test100\") // false\n}\n```\n\n## Ring Buffer\n```go\nimport \"github.com/xwzy/godan/ringbuffer\"\n\nfunc main() {\n    buffer := ringbuffer.NewRingBuffer(10)\n    \n    for i := 0; i \u003c 5; i++ {\n        buffer.Write(i)\n    }\n    buffer.ReadAll() // nil, nil, nil, nil, nil, 0, 1, 2, 3, 4\n    \n    for i := 5; i \u003c 17; i++ {\n        buffer.Write(i)\n    }\n    buffer.ReadAll() // 7, 8, 9, 10, 11, 12, 13, 14, 15, 16\n    \n    for i := 50; i \u003c 58; i++ {\n        buffer.Write(i)\n    }\n    buffer.ReadAll() // 15, 16, 50, 51, 52, 53, 54, 55, 56, 57\n    buffer.Read(3)   // 55, 56, 57\n}\n```\n\n## Counter\n```go\nimport \"github.com/xwzy/godan/counter\"\nimport \"log\"\n\nfunc main () {\n    c := counter.DefaultCounter()\n    // count in-coming query\n    c.CountOne()\n    // get the query count\n    c.GetTotal()\n}\n```\n\n## Bitmap\n```go\nimport \"github.com/xwzy/godan/bitmap\"\n\nfunc main () {\n    b := bitmap.NewBitMap(1000000) \n    // set the number of bit position\n    b.Set(1532)\n    b.Exist(1532) // true\n    b.Exist(532)  // false\n    \n    b.Delete(1532)\n    b.Exist(1532) // false)\n}\n```\n\n## Stack\n```go\nimport \"github.com/xwzy/godan/stack\"\n\nfunc main()  {\n    s := stack.DefaultStack()\n    s.Push(123)\n    s.Top()       // 123\n    s.Pop()\n}\n```\n\n## Queue\n```go\nimport \"github.com/xwzy/godan/queue\"\n\nfunc main()  {\n    q := queue.DefaultQueue()\n    q.Push(111)\n    q.Push(222)\n    q.Front()    // 111\n    q.Back()     // 222\n    q.Pop()\n    q.Pop()\n    q.Empty()    // true\n}\n```\n\n## Deque\n```go\nimport \"github.com/xwzy/godan/deque\"\n\nfunc main()  {\n    q := deque.DefaultDeque()\n    q.PushBack(222)\n    q.PushFront(111)\n    q.Front()    // 111\n    q.Back()     // 222\n    q.PopFront()\n    q.PopBack()\n    q.Empty()    // true\n}\n```\n\n## Vector\n```go\nimport \"github.com/xwzy/godan/vector\"\n\nfunc main()  {\n    vec := vector.DefaultVector()\n    vec.PushBack(111)\n    vec.Back()    // 111\n    vec.PushBack(222)\n    vec.At(0)     // 111\n    vec.At(1)     // 222\n    \n    vec.Set(0, 333)\n    vec.At(0)     // 333\n    \n    vec.SwapPosition(0, 1)\n    vec.At(0)     // 222\n    vec.At(1)     // 333\n    \n    vec.PopBack()\n    vec.Empty()   // false\n    vec.Clear()\n    vec.Empty()   // true\n}\n```\n\n## Set\n```go\npackage set\n\nimport \"github.com/xwzy/godan/set\"\n\nfunc main() {\n\ts1 := DefaultSet()\n\ts2 := DefaultSet()\n\n\ts1.Add(1)\n\ts2.Add(2)\n\ts1.Add(3)\n\ts2.Add(3)\n\n\ts1.InterSection(s2).Exist(3) // true\n}\n```\n\n## Trie\n```go\nimport \"github.com/xwzy/godan/trie\"\n\nfunc main() {\n    tree := trie.DefaultTrie()\n    tree.Insert(\"hello\")\n    tree.Search(\"hello\")   // true\n    tree.Search(\"hellooo\") // false\n    tree.Search(\"hel\")     // false\n    tree.StartsWith(\"hel\") // true\n\n    // support Unicode string\n    tree.Insert(\"你好\")\n    tree.Search(\"你好\")     // true\n    tree.Search(\"你好啊\")   // false\n    tree.Search(\"你\")      // false\n    tree.StartsWith(\"你\")  // true\n}\n```\n\n## What does godan mean?\n'Godan' is pronounced like \"狗蛋\" (Dog egg) in Chinese, which happens to be the name of my son.\n\n![](doc/img/godan.png)\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxwzy%2Fgodan","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fxwzy%2Fgodan","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxwzy%2Fgodan/lists"}