55 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			55 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package utility
 | 
						|
 | 
						|
import (
 | 
						|
	"github.com/mitchellh/mapstructure"
 | 
						|
	"reflect"
 | 
						|
	"time"
 | 
						|
)
 | 
						|
 | 
						|
// 映射;
 | 
						|
type maps struct {
 | 
						|
}
 | 
						|
 | 
						|
// 构建;
 | 
						|
func Maps() *maps {
 | 
						|
	return &maps{}
 | 
						|
}
 | 
						|
 | 
						|
// 转为结构体;
 | 
						|
func (this *maps) Struct(src, dst interface{}) error {
 | 
						|
	config := &mapstructure.DecoderConfig{
 | 
						|
		WeaklyTypedInput: true,
 | 
						|
		DecodeHook:       mapstructure.ComposeDecodeHookFunc(ToTimeHookFunc()),
 | 
						|
		Result:           &dst,
 | 
						|
	}
 | 
						|
	decoder, err := mapstructure.NewDecoder(config)
 | 
						|
	if err != nil {
 | 
						|
		return err
 | 
						|
	}
 | 
						|
	if err = decoder.Decode(src); err != nil {
 | 
						|
		return err
 | 
						|
	}
 | 
						|
	return nil
 | 
						|
}
 | 
						|
func ToTimeHookFunc() mapstructure.DecodeHookFunc {
 | 
						|
	return func(
 | 
						|
		f reflect.Type,
 | 
						|
		t reflect.Type,
 | 
						|
		data interface{}) (interface{}, error) {
 | 
						|
		if t != reflect.TypeOf(time.Time{}) {
 | 
						|
			return data, nil
 | 
						|
		}
 | 
						|
 | 
						|
		switch f.Kind() {
 | 
						|
		case reflect.String:
 | 
						|
			return time.Parse(time.RFC3339, data.(string))
 | 
						|
		case reflect.Float64:
 | 
						|
			return time.Unix(0, int64(data.(float64))*int64(time.Millisecond)), nil
 | 
						|
		case reflect.Int64:
 | 
						|
			return time.Unix(0, data.(int64)*int64(time.Millisecond)), nil
 | 
						|
		default:
 | 
						|
			return data, nil
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |