Skip to content
Python-like dictionaries for Go
Branch: master
Clone or download
srfrog
Latest commit 5eca6a1 May 2, 2019
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
.travis.yml Update .travis.yml Apr 26, 2019
LICENSE
README.md
benchmark_test.go
conv.go Initial release Apr 18, 2019
dict.go Change comment and remove extra log in test Apr 23, 2019
dict_test.go Change comment and remove extra log in test Apr 23, 2019
doc.go json.go: Add json marshal/unmarshal support. May 2, 2019
example_test.go Initial release Apr 18, 2019
json.go
json_test.go json_test.go: Fix some test converage May 2, 2019
key.go Initial release Apr 18, 2019

README.md

Dict

GoDoc Go Report Card Coverage Status Build Status

Python dictionary data type (dict) in Go

Package dict is a Go implementation of Python dict, which are hashable object maps. Dictionaries complement Go map and slice types to provide a simple interface to store and access key-value data with relatively fast performance at the cost of extra memory. This is done by using the features of both maps and slices.

Quick Start

Install using "go get":

go get github.com/srfrog/dict

Then import from your source:

import "github.com/srfrog/dict"

View example_test.go for an extended example of basic usage and features.

Features

  • Initialize a new dict with scalars, slices, maps, channels and other dictionaries.
  • Go types int, uint, float, string and fmt.Stringer are hashable for dict keys.
  • Go map keys are used for dict keys if they are hashable.
  • Dict items are sorted in their insertion order, unlike Go maps.
  • Go routine safe with minimal mutex locking (WIP)
  • Builtin JSON support for marshalling and unmarshalling
  • sql.Scanner support via optional sub-package (WIP)
  • Plenty of tests and examples to get you started quickly (WIP)

Documentation

The full code documentation is located at GoDoc:

http://godoc.org/github.com/srfrog/dict

The source code is thoroughly commented, have a look.

Usage

Minimal example showing basic usage:

package main

import (
   "github.com/srfrog/dict"
)

type Car struct {
   Model, BrandID string
}

func main() {
   // Map of car models, indexed by VIN.
   // Data source: NHTSA.gov
   vins := map[string]*Car{
      "2C3KA43R08H129584": &Car{
         Model:   "2008 CHRYSLER 300",
         BrandID: "ACB9976A-DB5F-4D57-B9A8-9F5C53D87C7C",
      },
      "1N6AD07U78C416152": &Car{
         Model:   "2008 NISSAN FRONTIER SE-V6 RWD",
         BrandID: "003096EE-C8FC-4C2F-ADEF-406F86C1F70B",
      },
      "WDDGF8AB8EA940372": &Car{
         Model:   "2014 Mercedes-Benz C300W4",
         BrandID: "57B7B707-4357-4306-9FD6-1EDCA43CF77B",
      },
   }

   // Create new dict and initialize with vins map.
   d := dict.New(vins)

   // Add a couple more VINs.
   d.Set("1N4AL2AP4BN404580", &Car{
      Model:   "2011 NISSAN ALTIMA 2.5 S CVT",
      BrandID: "003096EE-C8FC-4C2F-ADEF-406F86C1F70B",
   })
   d.Set("4T1BE46K48U762452", &Car{
      Model:   "2008 TOYOTA Camry",
      BrandID: "C5764FE4-F1E8-46BE-AFC6-A2FC90110387",
   })

   // Check current total
   fmt.Println("Total VIN Count:", d.Len())

   // Print VINs that have 3 or more recalls
   for item := range d.Items() {
      car, ok := item.Value.(*Car)
      if !ok {
         continue // Not a Car
      }
      if car.Recalls < 3 {
         continue // Not enough recalls
      }
      fmt.Println("---")
      fmt.Println("VIN:", item.Key)
   }
}
You can’t perform that action at this time.