gofmt
add more test
use hlist instead of "container/list" for saving memory