В Golang, могу ли я настроить сравнение ключей, если я принимаю struct в качестве ключа?

Как карта в Golang сравнить ключи? По какой-то причине мне нужно иметь в качестве ключа структуру, которая имеет 2 значения внутри. Я хочу, чтобы карта сравнивалась только по первому значению, а не по второму. Во-вторых, для моего использования. Как и в java, я могу настроить equalsметод, поэтому map будет принимать только logically equalключи внутри. Есть ли способ сделать это?

Edit: похоже, что это невозможно сделать. Поэтому сейчас я ставлю свою проблему здесь. Пожалуйста, помогите мне думать в «Go-way».

Поэтому я хочу реализовать «временную карту», которая отслеживает время вставки ключа. Другими словами, существует карта, которая принимает и обрабатывает значения. Теперь, если данные на карте старше определенного временного интервала, то я должен очистить его.

Итак, я подумал о том, чтобы иметь ключевую структуру, которая имеет идентификатор и метку времени. Когда приходит новый ключ, map берет его с id и currentTimeInMillis. Через некоторое время, если приходит ключ, который уже существует, то map должен сохранить первое время вставки и только обновляет массив значений.

Чтобы обработать, у меня будет цикл по карте и проверить, если какой-либо конкретный ключ находится внутри больше, чем пороговый предел, то я очищаю его. Я могу иметь эту метку времени в массиве значений, но она также имеет свою собственную метку времени, поэтому добавление еще одного может запутать кого-то другого.

Пожалуйста, предложите что-нибудь.

1 ответ

  1. Поставьте время на ваше значение. Ниже приведен пример структурирования данных.

    type DataObj struct {
         Id int
         Updated time.Date
         // other fields
    }
    
    m := map[int]DataObj{}
    m[d.Id] = d // assign using the id as your key
    
    for k, v := range m {
        if time.Since(v.Updated) > duration {
             delete(m, k) // remove the stale item
        }
    }
    
    // some logic like this for adding/overwriting
    v, ok := m[newObj.Id]
    if ok { // an element with this id existed
         if time.Since(v.Updated) > duration {
              m[v.Id] = newObj // assign new value over old one
         }
    }
    

    Я не могу предоставить ничего более конкретного, потому что у вас нет никакого кода для работы. Кажется, что вы, вероятно, хотели бы, чтобы некоторые из этого (например, удалить биты), чтобы работать на таймере. Для этого вызовите функцию как goroutine и используйте таймер, чтобы каждые X секунд она разблокировала и удалила элементы с карты. Если вы делаете это, вам также нужно использовать мьютекс, чтобы область вызова не обращалась к карте, в то время как функция удаления, выполняющая фон, отфильтровывает старые элементы.

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

    Главное, что нужно здесь убрать, это не использовать структуру для вашего ключа… Нет причин делать объект равноправным, ваш объект имеет идентификатор, нам он как ваш ключ. Все остальное, о чем вы заботитесь, может быть удержано на значении (даже сам ключ). Как кто-то указал, это не Java, и даже если бы это было, равенство переопределяет в C#, и Java-буквально гребаный кошмар.