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
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 |