示例#1
0
func number(val interface{}) ([]byte, error) {
	var buffer bytes.Buffer
	buffer.WriteByte(value_number)
	s, err := cast.ToStringE(cast.ToFloat64(val))
	if err != nil {
		return nil, err
	}
	buffer.WriteString(s)
	return buffer.Bytes(), nil
}
示例#2
0
// Less reports whether the element with
// index i should sort before the element with index j.
func (ps PageSort) Less(i, j int) bool {
	pi := ps.Pages[i]
	pj := ps.Pages[j]

	fi, ok := pi.meta[ps.Field]
	if !ok {
		return false
	}
	fj, ok := pj.meta[ps.Field]
	if !ok {
		return true
	}

	tpi := reflect.TypeOf(fi)
	tpj := reflect.TypeOf(fj)

	if tpi != tpj {
		if tpi.Kind() < tpj.Kind() {
			if ps.Ascend {
				return true
			} else {
				return false
			}
		} else {
			if ps.Ascend {
				return false
			} else {
				return true
			}
		}
	} else {
		switch tpi.Kind() {
		case reflect.Bool:
			vi := cast.ToBool(fi)
			vj := cast.ToBool(fj)
			if vi == false {
				if ps.Ascend {
					return true
				} else {
					return false
				}
			}
			if vj == false {
				if ps.Ascend {
					return false
				} else {
					return true
				}
			}
		case reflect.Int:
			fallthrough
		case reflect.Int8:
			fallthrough
		case reflect.Int16:
			fallthrough
		case reflect.Int32:
			fallthrough
		case reflect.Int64:
			fallthrough
		case reflect.Uint:
			fallthrough
		case reflect.Uint8:
			fallthrough
		case reflect.Uint16:
			fallthrough
		case reflect.Uint32:
			fallthrough
		case reflect.Uint64:
			vi := cast.ToInt(fi)
			vj := cast.ToInt(fj)
			if vi <= vj {
				if ps.Ascend {
					return true
				} else {
					return false
				}
			} else {
				if ps.Ascend {
					return false
				} else {
					return true
				}
			}
		case reflect.Float32:
			fallthrough
		case reflect.Float64:
			vi := cast.ToFloat64(fi)
			vj := cast.ToFloat64(fj)
			if vi <= vj {
				if ps.Ascend {
					return true
				} else {
					return false
				}
			} else {
				if ps.Ascend {
					return false
				} else {
					return true
				}
			}
		case reflect.String:
			vi := cast.ToString(fi)
			vj := cast.ToString(fj)
			if vi <= vj {
				if ps.Ascend {
					return true
				} else {
					return false
				}
			} else {
				if ps.Ascend {
					return false
				} else {
					return true
				}
			}
		default:
			if vi, err := cast.ToDurationE(fi); err == nil {
				vj := cast.ToDuration(fj)
				if vi <= vj {
					if ps.Ascend {
						return true
					} else {
						return false
					}
				} else {
					if ps.Ascend {
						return false
					} else {
						return true
					}
				}
			}

			if vi, err := cast.ToTimeE(fi); err == nil {
				vj := cast.ToTime(fj)
				if vi.UnixNano() <= vj.UnixNano() {
					if ps.Ascend {
						return true
					} else {
						return false
					}
				} else {
					if ps.Ascend {
						return false
					} else {
						return true
					}
				}
			}
		}
	}

	return false
}