func (n *Node) IsTime() bool {
	if n == nil {
		return false
	}
	return n.ValueType() == "time.Time"
}
IsTime returns true when the node represents a time.Time
struct.
package node
import (
	"errors"
	"fmt"
	"reflect"
	"strconv"
	"strings"
	"time"
	"github.com/pcelvng/go-config/util"
)
type Nodes struct {
	nodesMap   map[string]*Node  
	nodesSlice []*Node           
	v          interface{}       
}
func (ns *Nodes) Map() map[string]*Node {
	return ns.nodesMap
}
func (ns *Nodes) List() []*Node {
	return ns.nodesSlice
}
func (ns *Nodes) StructPtr() interface{} {
	return ns.v
}
func (ns *Nodes) SetTag(fieldName, key, value string) error {
	n, ok := ns.nodesMap[fieldName]
	if !ok {
		return errors.New("unable to set field tag: no field found by name '" + fieldName + "'")
	}
	n.SetTag(key, value)
	return nil
}
type Node struct {
	Prefix string  
	FieldValue reflect.Value
	Field      reflect.StructField
	Index int
	tag map[string]string
	meta map[string]string
}
func (n *Node) FieldName() string {
	return n.Field.Name
}
func (n *Node) FullName() string {
	if n.Prefix == "" {
		return n.FieldName()
	}
	return n.Prefix + "." + n.FieldName()
}
func (n *Node) ParentName() string {
	return n.Prefix
}
func (n *Node) ParentsNames() []string {
	names := make([]string, 0)
	if n.ParentName() == "" {
		return names
	}
	lineage := strings.Split(n.ParentName(), ".")
	for i := 0; i < len(lineage); i++ {
		names = append(names, strings.Join(lineage[:i+1], "."))
	}
	return names
}
func (n *Node) ValueType() string {
	return n.FieldValue.Type().String()
}
func (n *Node) Kind() reflect.Kind {
	return n.FieldValue.Kind()
}
func (n *Node) SetTag(key, value string) {
	if value == "" || key == "" {
		return
	}
	n.tag[key] = value
}
func (n *Node) GetTag(key string) string {
	if v, ok := n.tag[key]; ok {
		return v
	}
	return n.Field.Tag.Get(key)
}
func (n *Node) SetMeta(key, value string) {
	if value == "" || key == "" {
		return
	}
	n.meta[key] = value
}
func (n *Node) GetMeta(key string) string {
	return n.meta[key]
}
func (n *Node) GetBoolTag(key string) bool {
	bv, _ := strconv.ParseBool(n.GetTag(key))
	return bv
}
func (n *Node) SetBoolTag(key string, value bool) {
	n.SetTag(key, strconv.FormatBool(value))
}
func (n *Node) IsStruct() bool {
	return n.Kind() == reflect.Struct
}
func (n *Node) IsString() bool {
	return n.Kind() == reflect.String
}
func (n *Node) IsDuration() bool {
	return n.ValueType() == "time.Duration"
}