All checks were successful
CI / Check PR Title (push) Has been skipped
CI / Go Lint (push) Successful in 43s
CI / Makefile Lint (push) Successful in 41s
CI / Markdown Lint (push) Successful in 32s
CI / Unit Tests (push) Successful in 39s
CI / Fuzz Tests (push) Successful in 1m44s
CI / Mutation Tests (push) Successful in 1m28s
## Description
Currently, the signature for `Table.Get` is `func (K) (V, error)`. This is not very Go-idiomatic, which prefers to return a boolean instead of an error. For instance, a built-in Go map is used like so:
```go
if value, ok := users[id]; !ok {
// ...
}
```
Updating our table to look like that is best practice. In that same vein, to support direct lookup (i.e. `v := users[id]`), this PR also adds `Table.Find`.
## Changes
- BREAKING CHANGE: Update contract of `Table.Get` to `func (K) (V, bool)`. Returns 'false' is the item cannot be found, and 'true' if it is found.
- Add `Table.Find`.
- Updated tests and documentation to match the change.
### Design Decisions
- Chose to make this decision because throwing an error implies that there is something 'wrong' with the table. There is nothing wrong with the table; it is just that the item does not exist.
## Checklist
- [x] Tests pass
- [x] Docs updated
Reviewed-on: #20
Co-authored-by: M.V. Hutz <git@maximhutz.me>
Co-committed-by: M.V. Hutz <git@maximhutz.me>
33 lines
533 B
Go
33 lines
533 B
Go
// This example
|
|
package cuckoo_test
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"git.maximhutz.com/tools/go-cuckoo"
|
|
)
|
|
|
|
func Example_basic() {
|
|
table := cuckoo.NewTable[int, string]()
|
|
|
|
if err := table.Put(1, "Hello, World!"); err != nil {
|
|
fmt.Println("Put error:", err)
|
|
}
|
|
|
|
if item, ok := table.Get(1); !ok {
|
|
fmt.Println("Not Found 1!")
|
|
} else {
|
|
fmt.Println("Found 1:", item)
|
|
}
|
|
|
|
if item, ok := table.Get(0); !ok {
|
|
fmt.Println("Not Found 0!")
|
|
} else {
|
|
fmt.Println("Found 0:", item)
|
|
}
|
|
|
|
// Output:
|
|
// Found 1: Hello, World!
|
|
// Not Found 0!
|
|
}
|