English | 中文
Generics collections framework for Golang.
Note
This package requires Go version 1.18+.
This package provides the following data structure interfaces and implementations:
-
Collection: The root interface of most of the structures in this package (withoutDict). -
List: An ordered collection (also known as a sequence).-
list.ArrayList: The implementation of List based on Go built-in slice structure. -
list.LinkedList: The implementation of List based on doubly linked list. -
list.CopyOnWriteArrayList: The thread safe implementation of List based on copy-on-write strategy. -
list.LockList: The thread safe wrapper of List based on RWMutex.
-
-
Stack: A collection that follows the LIFO (last-in, first-out) principle.stack.Stack: The stack implementation based on ArrayList.
-
Set: A collection interface that contains no duplicate elements.-
set.HashSet: The implementation of Set based on Go built-in map structure. -
set.SyncSet: The thread safe implementation of Set based onsync.Map. -
set.LockSet: The thread safe wrapper of Set based on RWMutex.
-
-
Dict: A object that maps keys to values, and it cannot contain duplicate key.-
dict.HashDict: The implementation of Dictionary based on Go built-in map structure. -
dict.SyncDict: The thread safe implementation of dictionary based onsync.Map. -
dict.LockDict: The thread safe wrapper of Dictionary based on RWMutex.
-
You can install this package by the following command.
go get -u github.com/ghosind/collectionAfter installation, you can import it by the following code.
import "github.com/ghosind/collection"Create an integer list, add and get elements from the list.
// import "github.com/ghosind/collection/list"
l := list.NewArrayList[int]()
l.Add(10)
l.Add(20)
l.Add(30)
log.Print(l.Get(1)) // 20Create a string set, add and test elements in the set.
// import "github.com/ghosind/collection/set"
fruits := set.NewHashSet[string]()
fruits.Add("Apple")
fruits.Add("Banana")
log.Print(fruits.Contains("Banana")) // true
log.Print(fruits.Contains("Lemon")) // false// import "github.com/ghosind/collection/dict"
languages := dict.NewHashDict[string, int]()
languages.Put("C", 1972)
languages.Put("Go", 2007)
log.Print(languages.GetDefault("C", 0)) // 1972This example shows how to wrap an existing ArrayList with LockList to make it thread safe.
unsafeList := list.NewArrayList[int]()
safeList := list.NewLockList[int](unsafeList)
safeList.Add(10)
log.Print(safeList.Get(0)) // 10Run unit tests for the whole repository:
go test ./...Run benchmarks (all packages):
go test -bench=. -benchmem ./...Run benchmarks for a single package (example: dict):
go test ./dict -bench=. -run=^$ -benchmemBelow are sample benchmark results run on an Apple M2 machine and Go 1.25.1. Your results may vary depending on Go version and system load.
Dict benchmarks with Get/Put:
BenchmarkBuiltinMap_Get-8 78146028 17.79 ns/op 0 B/op 0 allocs/op
BenchmarkBuiltinMap_Put-8 43320583 25.11 ns/op 0 B/op 0 allocs/op
BenchmarkHashDict_Get-8 70750198 16.34 ns/op 0 B/op 0 allocs/op
BenchmarkHashDict_Put-8 34192296 31.89 ns/op 0 B/op 0 allocs/op
BenchmarkLockedHashDict_Get-8 10532293 113.8 ns/op 0 B/op 0 allocs/op
BenchmarkLockedHashDict_Put-8 9389860 129.7 ns/op 0 B/op 0 allocs/op
BenchmarkSyncDict_Get-8 202971288 6.154 ns/op 0 B/op 0 allocs/op
BenchmarkSyncDict_Put-8 9171009 130.0 ns/op 16 B/op 1 allocs/op
Set benchmarks with Add/Contains:
BenchmarkHashSet_Add-8 87384132 13.21 ns/op 0 B/op 0 allocs/op
BenchmarkHashSet_Contains-8 87521766 13.77 ns/op 0 B/op 0 allocs/op
BenchmarkLockHashSet_Add-8 41700088 29.54 ns/op 0 B/op 0 allocs/op
BenchmarkLockHashSet_Contains-8 60127644 19.93 ns/op 0 B/op 0 allocs/op
BenchmarkBuiltinMapAsSet_Add-8 87572594 13.49 ns/op 0 B/op 0 allocs/op
BenchmarkBuiltinMapAsSet_Contains-8 84940970 12.69 ns/op 0 B/op 0 allocs/op
BenchmarkSyncSet_Add-8 10465891 110.3 ns/op 0 B/op 0 allocs/op
BenchmarkSyncSet_Contains-8 245409312 5.671 ns/op 0 B/op 0 allocs/op
This project is licensed under the MIT License - see the LICENSE file for details.