In [1]:
type TrieMap struct {
    node  map[byte]*TrieMap
    empty bool
    value string
}

func (tm *TrieMap) add(key, value string) {
    cur := tm
    for _, c := range []byte(key) {
        if _, ok := cur.node[c]; ! ok {
            cur.node[c] = &TrieMap{make(map[byte]*TrieMap), true, ""}
        }
        cur = cur.node[c]
    }
    cur.empty = false
    cur.value = value
}

func (tm *TrieMap) query(key string) (string, bool) {
    cur := tm
    for _, c := range []byte(key) {
        val, ok := cur.node[c]
        if !ok {
            return "", false
        }
        cur = val
    }
    return cur.value, !cur.empty
}

In [2]:
func NewTrieMap(keys, values []string) *TrieMap {
    tm := &TrieMap{make(map[byte]*TrieMap), true, ""}
    for i, key := range keys {
        tm.add(key, values[i])
    }
    return tm
}

In [3]:
keys := []string{"hello", "there", "the"}
values := []string{"1", "2", "3"}
tm := NewTrieMap(keys, values)

In [4]:
tm.query("hello")


1
true

In [5]:
tm.query("hello there")


false

In [6]:
tm.query("there")


2
true

In [7]:
tm.query("ther")


false

In [8]:
tm.query("the")


3
true

In [9]:
tm.query("")


false