Skip to main content


This package helps you to convert a struct to map[string]int64.


The encoding of each struct field can be customized by the format string stored under the stm key in the struct field's tag. The format string gives the name of the field, possibly followed by a comma-separated list of options.

Lack of tag means no conversion performed. If you don't want a field to be added to the map[string]int64 just don't add a tag to it.

Tag syntax:


Both multiplier and divisor are optional, name is mandatory.

Examples of struct field tags and their meanings:

// Field appears in map as key "name".
Field int `stm:"name"`
// Field appears in map as key "name" and its value is multiplied by 10.
Field int `stm:"name,10"`
// Field appears in map as key "name" and its value is multiplied by 10 and divided by 5.
Field int `stm:"name,10,5"`

Supported field value kinds#

The list is:

  • int
  • float
  • bool
  • map
  • array
  • slice
  • pointer
  • struct
  • interface { WriteTo(rv map[string]int64, key string, mul, div int) }

It is ok to have nested structures.


Use ToMap function. Keep in mind:

  • this function is variadic (can be called with any number of trailing arguments).
  • it doesn't allow to have duplicate in result map.
  • if there is a duplicate key it panics.
ms := struct {
MetricA int64 `stm:"metric_a"`
MetricB float64 `stm:"metric_b,1000"`
MetricSet map[string]int64 `stm:"metric_set"`
MetricA: 10,
MetricB: 5.5,
MetricSet: map[string]int64{
"a": 10,
"b": 10,
fmt.Println(stm.ToMap(ms)) // => map[metric_a:10 metric_b:5500 metric_set_a:10 metric_set_b:10]

Reach out

If you need help after reading this doc, search our community forum for an answer. There's a good chance someone else has already found a solution to the same issue.



Last updated on