Я пробовал утверждение типа, однако я не верю, что в моем случае это сработает, поскольку данные поступают с URL-адреса, который по умолчанию уже является строкой. Как определить, является ли запись строкой, int, логическим значением и т. Д.
В общем, не очень хорошая идея делать вещи чрезмерно динамичными (делает рассуждения о вещах более сложными, чем это должно быть). Лучше определить структуру и затем прочитать значения в нее.
Тем не менее, если мы придерживаемся формулировки вашего вопроса, есть вещи, которые вы можете сделать:
Например, создайте универсальный тип, который может хранить несколько версий значения, вместе с флагом, чтобы указать, правильно ли оно проанализировано в этом типе:
type GenericValue struct {
String string
Integer int
IntegerOK bool
Float float64
FloatOK bool
Boolean bool
BooleanOK bool
}
func ParseGenericValue(v string) GenericValue {
var result GenericValue
var err error
result.String = v
result.Integer, err = strconv.Atoi(v)
result.IntegerOK = err == nil
result.Float, err = strconv.ParseFloat(v, 64)
result.FloatOK = err == nil
result.Boolean, err = strconv.ParseBool(v)
result.BooleanOK = err == nil
return result
}
Все, что для этого нужно - использовать пакет strconv , чтобы попытаться проанализировать входную строку как целое число / число с плавающей запятой / логическое значение, и, если анализ успешен, он создает соответствующее поле OK
. Например, если IntegerOK
истинно, это означает, что синтаксический анализ этой строки в целое число прошел успешно.
Структура GenericValue
по-прежнему содержит исходную строку ввода, так что вы можете использовать ее, чтобы проверить, является ли это значение целым числом, и сделать что-то с ним, или проверить, является ли это строкой, и сделать что-то еще
var v = ParseGenericValue("2")
if v.IntegerOK {
// do something with v.Integer
} else {
// maybe just handle v.String in a different way
}