Обновление ключа на карте, итерация по этой карте - PullRequest
0 голосов
/ 07 января 2019

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

Это карта

var data map[string][]string

Метод PUT для функции im, вызывающей

r.HandleFunc("/updatekey/{key}/{newkey}", handleUpdateKey).Methods("PUT")

Функция handleUpdateKey, в которой подробно объясняется, что он делает.

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

k := params["key"] //get url params
nk := params["newkey"]

s := make([]string, len(data[k])) //create slice of string to store map variables
for i := range data {             //range over the data map
    fmt.Fprintf(w, i)
    if k != i { //check if no keys exist with URL key param
        fmt.Fprintf(w, "That KEY doesn't exist in memory")
        break //kill the loop
    } else { //if there is a key the same as the key param
        for _, values := range data[i] { //loop over the slice of string (values in that KEY)
            s = append(s, values) //append all those items to the slice of string
        }

        delete(data, k) //delete the old key

        for _, svalues := range s { //loop over the slice of string we created earlier
            data[nk] = append(data[nk], svalues) //append the items within the slice of string, to the new key... replicating the old key, with a new key name
        }
    }
}
}

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

KEY: catt: VALUE: 
KEY: catt: VALUE: 
KEY: catt: VALUE: zeus
KEY: catt: VALUE: xena

СТАРЫЙ ВЫХОД:

KEY: dog: VALUE: zeus
KEY: dog: VALUE: xena

ПРАВИЛЬНЫЙ НОВЫЙ ВЫХОД:

KEY: catt: VALUE: zeus
KEY: catt: VALUE: xena

1 Ответ

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

В большинстве языков изменение структуры, по которой вы выполняете итерацию, вызовет странные вещи. Особенно карты. Вы должны найти другой путь.

К счастью, итераций вообще не нужно. Ваш цикл - это всего лишь один большой оператор if / else. Если ключ совпадает, сделайте что-нибудь. Если это не так, сделайте что-нибудь еще. Так как это карта, нет необходимости искать ключ с помощью итерации, его можно искать напрямую. Также нет необходимости во всех этих трудоемких циклах только для копирования значения карты.

if val, ok := data[k]; ok {
    // Copy the value
    data[nk] = val
    // Delete the old key
    delete(data, k)
} else {
    fmt.Fprintf(w, "The key %v doesn't exist", k)
}

Наконец, избегайте использования глобалов в функциях. Это затрудняет понимание того, как функция влияет на программу, если она может изменять глобальные переменные. data следует передать в функцию, чтобы она прояснилась.

func handleUpdateKey(w http.ResponseWriter, r *http.Request, data map[string][]string)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...