Создание карты с интерфейсом типов для приема произвольных типов данных через параметры URL - PullRequest
0 голосов
/ 09 января 2019

Я хочу преобразовать параметры URL из строки в правильный тип данных и сохранить его на карте. Я считаю, что тип должен быть [] интерфейс, чтобы хранить список нескольких типов данных.

Я создаю хранилище значений ключей, но на данный момент в нем хранятся только строки. Я прочитал о GOB, чтобы преобразовать данные в байты, но не понимаю.

Я пробовал утверждение типа, однако я не верю, что в моем случае это сработает, поскольку данные поступают с URL-адреса, который по умолчанию уже является строкой. Как определить, является ли запись строкой, int, логическим значением и т. Д.?

Карта:

var data map[string][]string 

handleFunc в основной функции, которая вызывает функцию handleCreate

r.HandleFunc("/insert/{key}/{value}", handleCreate).Methods("POST")  

функция handleFunc

func handleCreate(w http.ResponseWriter, r *http.Request) {
params := mux.Vars(r)

k := params["key"]
v := params["value"]

data[k] = append(data[k], v)
fmt.Fprintf(w, "KEY: %v: VALUE: %v was inserted into the key-value store successfully", k, v)
}

Ссылка на полный код:

https://github.com/RipRoss/TrainingProjects/blob/master/main.go

Ожидаемый результат - сохранить значение, указанное в URL-адресе, как и для чего оно предназначено. Например, / dog / Zeus будет хранить Zeus как строку с ключом «dog», а / cash / 1000 будет хранить 1000 как тип int с ключом «cash»

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Я пробовал утверждение типа, однако я не верю, что в моем случае это сработает, поскольку данные поступают с 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
}
0 голосов
/ 09 января 2019

Проверьте этот пакет, который преобразует параметры URL в структуру с ожидаемыми полями. Это полезно, конечно, когда вы знаете ожидаемые типы данных.

https://github.com/gorilla/schema

Например,

type ServiceInput struct {
  Latitude                 float64  `schema:"latitude,required"` //add validations too
  Longitude                 float64  `schema:"longitude"`
}

...

r := new(ServiceInput)
urlParams := request.URL.Query() //request is http.Request

decoder := schema.NewDecoder()
if err := decoder.Decode(r, urlParams); err != nil {
    return nil, lib.ErrBadRequest{Err: err}
}

Теперь, принимая запрос как GET /foo/bar?latitude=1.2&longitude=3.4, он соответственно установит поля структуры.

Если вы не имеете никакого представления о типе поля, то вам нужно попробовать выполнить синтаксический анализ другого типа и проверить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...