Всегда ли я буду получать верное значение 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 шт):

Автор решения: Senior Pomidor

представь что 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 один раз, запомнить. пройтись по нему вместо вызова каждый раз )

→ Ссылка