Skip to content

Latest commit

History

15 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Golang Iterator for ordered map

Build StatusGoDoc

  1. The order of the elements in the map.

  2. Transparent use *interface{} as value.

Installation

$ go get github.com/mantyr/iterator

Examples

package main
import (
"github.com/mantyr/iterator""fmt""strconv"
)
typeObjstruct {
param1intparam2string
}
funcmain() {
items:=iterator.New()
items.Add("test1", "value1")
items.Add("test2", "value2")
items.Add("test2", "value2")
items.Add("test3", "value3")
items.Add("test4", "value4")
fmt.Println("Ordered map:")
foritem:=rangeitems.Iter() {
fmt.Printf("Position %q, key %q, value %q \r\n", strconv.Itoa(item.Index), item.Key, item.Value)
}
fmt.Println("Default map:")
forkey, value:=rangeitems.Items {
fmt.Printf("Key %q, value %q \r\n", key, value)
}
// for *objobj:=new(Obj)
obj.param1=10obj.param2="test1"items=iterator.New()
items.Add("test5", obj)
fmt.Println("Ordered map *:")
foritem:=rangeitems.Iter() {
fmt.Printf("Position %q, key %q, value param2 %q \r\n", strconv.Itoa(item.Index), item.Key, item.Value.(*Obj).param2)
}
fmt.Println("Default map *:")
forkey, value:=rangeitems.Items {
fmt.Printf("Key %q, value param2 %q \r\n", key, value.(*Obj).param2)
}
}
/* outOrdered map:Position "0", key "test1", value "value1" Position "1", key "test2", value "value2" Position "2", key "test3", value "value3" Position "3", key "test4", value "value4" Default map:Key "test2", value "value2" Key "test3", value "value3" Key "test4", value "value4" Key "test1", value "value1" Ordered map *:Position "0", key "test5", value param2 "test1" Default map *:Key "test5", value param2 "test1"*/

Notice

Not use channel if you use "back" in loop. See also #1

package main
import (
"github.com/mantyr/iterator"
)
funcmain() {
items:=iterator.New()
fori:=0; i<100; i++ {
items.Add(i, i)
}
i:=0for_, key:=rangeitems.Keys {
item, ok:=items.Get(key)
if!ok {
continue
}
ifitem==10 {
break
}
i++
}
}

Example for html/template and helper function for objects

package main
import (
"log""net/http""github.com/gorilla/context""github.com/mantyr/iterator""html/template"
)
funcmain() {
http.HandleFunc("/test", handler_iterator)
iferr:=http.ListenAndServe(":8080", context.ClearHandler(http.DefaultServeMux)); err!=nil {
log.Fatal("ListenAndServe:", err)
}
}
typeObjstruct {
IdintSearchstring
}
typeObjMapstruct {
Valuesmap[string]string
}
func (o*ObjMap) Get(keystring) string {
val, ok:=o.Values[key]
ifok {
returnval
}
return""
}
funchandler_iterator(w http.ResponseWriter, r*http.Request) {
vartmpl=template.Must(template.ParseFiles("tmpl/index.html"))
items_st:=iterator.New()
items_st.Add("test1", "value1")
items_st.Add("test2", "value2")
items_st.Add("test2", "value2")
items_st.Add("test3", "value3")
items_st.Add("test4", "value4")
items:=iterator.New()
obj1:=Obj{1, "test1"}
obj2:=Obj{2, "test2"}
obj3:=Obj{3, "test3"}
items.Add("test1", obj1)
items.Add("test2", obj2)
items.Add("test3", obj3)
items_ob:=iterator.New()
obj_m1:=new(ObjMap)
obj_m2:=new(ObjMap)
obj_m3:=new(ObjMap)
obj_m1.Values=make(map[string]string)
obj_m1.Values["id"] ="1"obj_m1.Values["value"] ="test1"obj_m2.Values=make(map[string]string)
obj_m2.Values["id"] ="2"obj_m2.Values["value"] ="test2"obj_m3.Values=make(map[string]string)
obj_m3.Values["id"] ="3"obj_m3.Values["value"] ="test3"items_ob.Add("test1", obj_m1)
items_ob.Add("test2", obj_m2)
items_ob.Add("test3", obj_m3)
data:=struct {
ItemsString<-chan iterator.ItemItems<-chan iterator.ItemItemsObj<-chan iterator.Item
}{items_st.Iter(), items.Iter(), items_ob.Iter()}
tmpl.Execute(w, data)
}
$ cat tmpl/index.html
<divclass="content">
{{range $item := .ItemsString}}
<divclass="item finish" data-id="{{$item.Key}}">{{$item.Value}}</div>
{{end}}
</div><divclass="content">
{{range $item := .Items}}
<divclass="item finish" data-id="{{$item.Value.Id}}">{{$item.Value.Search}}</div>
{{end}}
</div><divclass="content">
{{range $item := .ItemsObj}}
<divclass="item finish" data-id="{{$item.Value.Get "id"}}">{{$item.Value.Get "value"}}</div>
{{end}}
</div>
http://localhost:8080/test
<divclass="content"><divclass="item finish" data-id="test1">value1</div><divclass="item finish" data-id="test2">value2</div><divclass="item finish" data-id="test3">value3</div><divclass="item finish" data-id="test4">value4</div></div><divclass="content"><divclass="item finish" data-id="1">test1</div><divclass="item finish" data-id="2">test2</div><divclass="item finish" data-id="3">test3</div></div><divclass="content"><divclass="item finish" data-id="1">test1</div><divclass="item finish" data-id="2">test2</div><divclass="item finish" data-id="3">test3</div></div>

More Examples

$ cat iterator_test.go

Author

Oleg Shevelev

About

Golang Iterator for ordered map

Resources

Stars

5 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages