Всегда ли я буду получать верное значение bool
Всех приветствую.
есть такой код.
func SetCook(w http.ResponseWriter) {
cookie := &http.Cookie{Name: "name", Value: "value"}
http.SetCookie(w, cookie)
}
func GetCook(r *http.Request) []*http.Cookie {
cook := r.Cookies()
return cook
}
func CheckCookie(r *http.Request) bool {
var Res bool //создаю переменную для проверки здесь предполагая что она будет видна и в цикле и вне цикла в return-е
for i := 0; i < len(GetCook(r)); i++ {
if GetCook(r)[i].Name == "name" {
Res = true
} else {
Res = false
}
}
return Res // в зависимости от проверки в блоке if возвращается bool, он берется из результата проверки в цикле(как я предполагаю)
}
func UnionHandler(w http.ResponseWriter, r *http.Request) {
SetCook(w)
if CheckCookie(r) { //проверяю что мне вернулось в типе bool и в зависимости от этого произвожу необходимые действия
//do something
} else {
log.Println("Bad cookie")
}
}
и у меня возникли сомнения что переменной Res(см. код) всегда будет присваиваться верное значение, так как сомневаюсь что из цикла она всегда будет возвращаться с верным значением, поскольку сомневаюсь в том что правильно оцениваю видимость переменной.
Может ли кто-то более опытный глянуть и подсказать, return всегда будет возвращать правильное значение присвоенное в цикле или я накосячил с зоной видимости и в Res всегда будет присваиваться рандомное значение в цикле?
При запуске кода, все выглядит так как будто конструкция рабочая, но ведь это может быть удачное стечение обстоятельств, а не верное решение.
Спасибо за внимание.
Ответы (1 шт):
представь что GetCook(r) возвращает массив из 3 элементов.
GetCook(r)[0] == "not name"GetCook(r)[1] == "name"GetCook(r)[2] == "not name"
исполняем функцию CheckCookie
- изначально res = false
- первая итерация. res = false
- вторая итерация. res = true
- третяя тиерация. res = false
- return res. то есть false
вот тут и есть проблема. а конкретно в том, что даже если нашли нужное свойство, то оно может быть перезаписано.
Я могу предложить следующее.
func CheckCookie(r *http.Request) bool {
var Res bool // по умолчанию bool типы будут false
for i := 0; i < len(GetCook(r)); i++ {
if GetCook(r)[i].Name == "name" {
Res = true // менять переменную только если нашли
}
}
return Res
}
теперь давайте упростим код.
func CheckCookie(r *http.Request) bool {
for i := 0; i < len(GetCook(r)); i++ {
if GetCook(r)[i].Name == "name" {
return true // если хоть один удовлетворяет уловию, то сразу выходим из функций с true
}
}
return false // если дошли это этой линии- это означает, что if внутри цикла не исполнился. ничего не нашли
}
можно еще оптимизировать, вызывая GetCook один раз, запомнить. пройтись по нему вместо вызова каждый раз )