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

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

"Cookie value"},
}

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

6 ответов

14 просмотров

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

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

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

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Карта сайта