"Cookie value"},
}
почему принтлн выводит пустой слайс?
fmt.Println вызовет cookie.String, он вернёт пустую строчку
причем если сделать fmt.Println() для http.Cookie{} (не &http.Cookie{}), то такого поведения не будет, потому что метод String определен только для *http.Cookie, не для http.Cookie
а еще у вас имя куки невалидное, сделайте без пробелов, тогда будет хоть какой-то вывод от println
Есть интерфейс Stringer, у которого есть метод String, он вызывается при вызове fmt.Println. Есть еще интерфейс Formatter, прикольная штука, кстати, можно под разные тэги (%v, %s ) вывод кастомизировать http.Cookie реализовывает этот интерфейс. При этом он реализовывает этот метод при передаче через указатель Когда ты вызываешь fmt.Println(&http.Cookie{}) или fmt.Printf("%s", &http.Cookie{}) , то вызывается метод String (для массива вызывается на каждом элементе массива) В методе String у http.Cookie, в первой же строчке, проверка на пустую куку и валидация названия (поле Name в http.Cookie) через функцию isCookieNameValid. Эта функция, через длинную цепочку вывода, приводит нас к месту, где каждый символ проверяется по таблице возможных символов ( https://github.com/golang/go/blob/master/src/vendor/golang.org/x/net/http/httpguts/httplex.go массив с 15ой строчки. Там нет пробела, но длинна массива 127. т.е. пробел там есть( int(' ')==32 ), но по дефолту значение у bool - false, т.е. пробел запрещен). Соответственно кука невалидна. Ты создаешь первую куку с Name: "Cookie name" и кладешь ее в массив указателей на куки. Соответственно когда ты без разыменовывания вызываешь fmt.Println, туда попадает указатель на структуру, и соответственно fmt.Println может вызвать метод String структуры http.Cookie, и соответственно она отваливается на этапе валидации из-за того что 7 символ в поле Name пробел. А когда ты передаешь в println саму куку, или разыменованный указатель, туда копируется структура, но у нее уже нет метода String, соответственно валидация не проходится, структура печатается просто по значениям через рефлексию. все названия полей со всеми значениями. В твоем случае у тебя валидация происходит. И метод String возвращает пустую строку и выводится это как слайс, у которого есть одна строка, пустая. И если есть еще одна кука в этом слайсе (как в примере чуть ниже), то выводится слайс с 2 элементами. 1 с пустой строкой, 2 нормальный. Это можно проверить так: cookies := []*http.Cookie{ { Name: "Cookie name", Value: "Cookie value", }, { Name: "asd", Value: "Cookie value", }, } fmt.Printf("%#v", cookies) // []*http.Cookie{(*http.Cookie)(0xc0000ea2c0), (*http.Cookie)(0xc0000ea370)} fmt.Printf("%+v", cookies) // [ asd="Cookie value"] В массиве 2 элемента, просто второй выводится как пустая строка
понял. спасибо
Обсуждают сегодня