170 похожих чатов

Cookies := []*http.Cookie{ {Name: "Cookie name", Value:

"Cookie value"},
}

почему принтлн выводит пустой слайс?

6 ответов

5 просмотров

fmt.Println вызовет cookie.String, он вернёт пустую строчку

Vadim Alekseev
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 элемента, просто второй выводится как пустая строка

Похожие вопросы

Обсуждают сегодня

я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
96
читать файл максимально быстро? странный вопрос))
zamtmn
53
How to create an OS in C? what to study?
Linus
18
тоесть, указав return eax, сгенерируется никому ненужная инструкция mov eax,eax ?
Aiwan \ (•◡•) / _bot
24
Всем доброго вечера! Хочу поделиться своим злоключением с человеком, который, как оказалось сюда тоже скидывал свое резюме. Жаль, что я вашу группу не нашел раньше… человек ки...
Роман Ахмедзянов
4
Компания Elif ищет менеджера проектов, который будет заниматься поиском и ведением новых проектов. Прежде чем приступить к работе, вам нужно пройти наш недельный курс, где вы ...
Elif
5
Привет, кто может сделать юзербота с апи? Задачи: - создавать группы - создавать каналы - задавать для созданных каналов аватарку или эмоджи, имя группы - добавлять в группы...
Lencore
11
Вопрос вроде правильно, но что надо сделать, чтоб текст был виден нормально ? ghci> TE.decodeUtf8 $ TE.encodeUtf8 "test - проба" "test - \1087\1088\1086\1073\1072"
Fedor
7
а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Кто может подсказать? Я преобрпзовал изображение в бинарное(у меня установлен трекбар который при установленном значении меняет пиксели на белый если меньше и чёрный если боль...
Константин VS
6
Карта сайта