Вам нужно создать значение внутренней карты (карты сеанса) только в том случае, если карта для данного идентификатора сеанса еще не существует (и не , если данный номер запроса отсутствует в нем) иначе вы удалите с него все ранее сохраненные номера запросов.
Поскольку вы используете bool
в качестве типа значения для внутренней карты (карты сеанса), вы можете использовать это для написания более простого кода (индексирование карты с ключом, которого в ней нет, даст нулевое значение тип значения (false
для типа bool
, правильно указывающий, что ключ не в нем):
func chkDuplicate(m map[string]map[string]bool, sess string, Reqno string) bool {
sessMap := m[sess]
if sessMap == nil {
m[sess] = map[string]bool{Reqno: true}
return false
}
if sessMap[Reqno] {
return true
}
sessMap[Reqno] = true
return false
}
Тестирование:
func main() {
mySessionData := make(map[string]map[string]bool)
for _, reqNo := range []string{"1", "2", "3", "2", "4"} {
ret := chkDuplicate(mySessionData, "session1", reqNo)
fmt.Println(ret, mySessionData)
}
delete(mySessionData, "session1")
fmt.Println(mySessionData)
}
Вывод (попробуйте на Go Playground ):
false map[session1:map[1:true]]
false map[session1:map[1:true 2:true]]
false map[session1:map[1:true 2:true 3:true]]
true map[session1:map[2:true 3:true 1:true]]
false map[session1:map[2:true 3:true 4:true 1:true]]
map[]
Обратите внимание, что bool
- хотя может быть небольшим - требует памяти. Поскольку мы можем запрашивать, есть ли ключ на карте, мы можем использовать тип значения, который не требует памяти, например, пустую структуру (struct{}
). При этом это может выглядеть так:
func chkDuplicate(m map[string]map[string]struct{}, sess string, Reqno string) bool {
sessMap := m[sess]
if sessMap == nil {
m[sess] = map[string]struct{}{Reqno: struct{}{}}
return false
}
if _, ok := sessMap[Reqno]; ok {
return true
}
sessMap[Reqno] = struct{}{}
return false
}
Тестирование и результат (почти) совпадают, попробуйте на Go Playground .
Слово предупреждения: судя по примеру, похоже, что вы хотите использовать это, чтобы отследить, был ли (веб) запрос был обслужен ранее, где обычно задействовано несколько goroutines. Это решение небезопасно для одновременного использования .