Anonymous
А давно из питона го начали делать ? a = [] # type: List[str]
Roman
//go:generate ?
А оно в каком контексте будет выполнено? В меня структуры зависят от целевой платформы
heavycharged
что-то я затупил, есть тип type HandlerError struct {}, с методом Error() string, есть канал chan HandlerError, есть функция, которая принимает аргумент errors <-chan error. Собственно, ошибка: cannot use errorChan (type chan status.HandlerError) as type <-chan error in argument to helper.DumpInfo. В канал же можно слать интерфейсный тип, и дергать метод, что не так? на что он ругается?
heavycharged
интерфейсный тип, я имею ввиду error же сам по себе интерфейс. мне нужно и на канале определить error тип?
Anonymous
python type hinting
Anonymous
https://www.python.org/dev/peps/pep-0484/#scoping-rules-for-type-variables
heavycharged
Тип chan и <-chan это разные типы
погоди, если я создаю канал, я же не могу создать канал из которого можно только читать, когда я передаю в функцию, тогда стрелка уже меняет суть, т.е. я не смогу записать в канал, если в сигнатуре указано что можно только читать
heavycharged
вот в этом случае, делаю chan HandlerError а в функцию передаю <-chan error
heavycharged
HandlerError реализует интерфейс error
heavycharged
но он ругается
heavycharged
сейчас попробую без стрелки
heavycharged
не, тут дело не в стрелке
Andrei 🦉
Выложи простой пример на playground
heavycharged
https://play.golang.org/p/nCt8KCZyRHJ
heavycharged
20 строка
heavycharged
а, ну да, я же канал определяю на четкой структуре, а не на интерфейсе.
𝕲𝖎𝖗𝖆𝖋𝖋𝖊
Только сегодня слушал выпуск golangshow и там правильно было сказано : "методы с ресивером *t и для *t и для t ибо и * и t, а методы с ресивером t - это только для t ибо * нигде нету" - гениальная логика чтобы запомнить
𝕲𝖎𝖗𝖆𝖋𝖋𝖊
https://play.golang.org/p/_4vag1uXgGf
Michael
https://play.golang.org/p/_4vag1uXgGf
та сообщение выше как-то замысловатое Go умеет делать и (&v).Call() и (*v).Call()
Michael
а v может быть или не быть *
Slava
можно же и для *t вызывать методы с ресивером t
Michael
можно же и для *t вызывать методы с ресивером t
возможно в пред истории ещё упоминались интерфейсы
🎉
Чото не вижу в готуре как мне проставить умолчальный case в switch? В смысле када ни одно условие не подошло.
𝕲𝖎𝖗𝖆𝖋𝖋𝖊
можно же и для *t вызывать методы с ресивером t
Не совсем https://play.golang.org/p/FhpTrRE7vW1
Slava
так ошибка же про то что у тебя ресивер нил
Slava
https://play.golang.org/p/-7ulsAS5ibW
𝕲𝖎𝖗𝖆𝖋𝖋𝖊
так ошибка же про то что у тебя ресивер нил
Если метод определения на *t то нет никакой разницы что t=nil или нет https://play.golang.org/p/q49uj4NHk1d
Slava
не понимаю этого аргумента =)
Slava
если следовать той же логике, я мог бы парировать, что ты потом при вызове t.поле в методе - так же огребёшь панику
𝕲𝖎𝖗𝖆𝖋𝖋𝖊
не понимаю этого аргумента =)
Аргумент в том, что если метод над *t - то это он в любом случае будет вызван, а если метод над t то он будет вызван только если ресивер не nil, иначе все с паникой упадёт
Slava
нууу, а как это мешает использовать ресиверы на t для *t? =)
Slava
проверил что не nil - вызвал
𝕲𝖎𝖗𝖆𝖋𝖋𝖊
проверил что не nil - вызвал
Согласен, нельзя тупо услышанному верить. Но остаётся оговорочка про "проверить"
Slava
возможно там был какой-то контекст
heavycharged
ну вот кстати, если я не ошибаюсь, если мы сделаем buf := bytes.Buffer{}, то записать в него сможем. Если эта штука придет через интерфейс к нам, а мы сделаем buf.(bytes.Buffer).WriteString(), то у нас ничего не выйдет.
heavycharged
"но это не точно".
heavycharged
а не, все ок.
heavycharged
хз почему, но когда я тестил недавно пул, мне тут кто-то посоветовал в пул ложить буфер не ссылке, а по значению, а указатель. то потом при ассерте к bytes.Buffer{} я получил что метод определен на ссылке.
Anonymous
Нашел очень быстрый и удобный парсер JSON-а. Особенно полезен, если из нежно нужно всего одно или два поля прочитать: https://github.com/tidwall/gjson
Quet
интересно парсер в нем это самописное или сгенерили из чего-то
Anonymous
интересно парсер в нем это самописное или сгенерили из чего-то
Там все самописное. Единственная внешняя зависимость только от github.com/tidwall/match от того же автора. А у этого пакета уже никаких внешних зависимостей)
Quet
ну плохо ( я понимаю когда такой отвратительно выглядящий код получается из всяких рагелей-бизонов
Evgeny
Подскажите, пожалуйста. Есть две функции, которые ничего не принимают и ничего не передают. Необходимо запустить вторую функцию, если первая закончилась к примеру os.Exit(1). Как это лучше оформить ? Если что я ещё нубяра.
Slava
os.Exit прерывает выполнение программы
Michael
"но это не точно".
случайно битки не майнишь?)
$continue$
всем привет. как создать массив из структуры. Т.е arr[MAX_SLOT][struct_name] (очень образно)
$continue$
var foo [64]struct_name
а обращение тогда: arr[i][struct_name.name]?
Michael
structObject := arr[i]
Michael
т.е. просто arr[i]
$continue$
т.е. просто arr[i]
а как мне к конкретному полю то обратиться?
Michael
arr[i].FieldName
andrew
Небольшой оффтоп. Можете посоветовать хорошую читалку для PDF? На ELink
andrew
о, отлично, спасибо!
andrew
то что надо
Anonymous
гы ... больше косаря зелени... интересно, за что ... %)
andrew
за удобство, оно того стоит
andrew
большая часть тех. литературы в пдф
andrew
осталось решить вопрос с доставкой...
Michael 🌌
Небольшой оффтоп. Можете посоветовать хорошую читалку для PDF? На ELink
https://www.amazon.com/All-New-Kindle-Paperwhite-High-Resolution-Display/dp/B00OQVZDJM/
andrew
6 дюмов, маленький, Вопрос в принципе закрыт, я вроде сони и искал.
Michael 🌌
https://www.amazon.com/Carta-Ereader-Flexible-Screen-Bluetooth/dp/0285175270/ref=as_li_ss_tl?ie=UTF8&linkCode=ll1&tag=ter000-20&linkId=58438ab46798bce04a6fe1d6f25e5492
Michael 🌌
Ну окей, закрыт так закрыт
andrew
всё равно спасибо :)
Антон
Всем привет. Пожалуйста, поясните на пальцах в двух словах, или же дайте хорошую статью на русском, которая обьяснит в чем разница между make и new. А то читаю сейчас eng источник и принципиальную разницу не совсем понял, из-за трудностей перевода.
Антон
Для разных типов. New для struct, make для массивов/слайсов/мап
а, вот это я понял, но там что-то долго обяснялось по поводу нулевых значений в struct и map, slice, array, и я думал так какой-то подвох который нужно знать. А так просто для себя запомню, что new для структ а для остального Make
Artem
просто new создает указатель на не композитные типы. new(chan int) создает *chan int, когда make(chan int) создает значение chan int т.е. new возвращет значение &T{}, на сколько я понимаю разница только в том, что последняя делает это в куче, но память алоцируемая нулевая, а make алоцирует и инициализирует память и потому используется для создания мап, слайсов и каналов.
Антон
разница в том, возвращается ссылка на адрес в памяти в одном случае и инициализированное значение в другом.
ну вообщем надеюсь для меня это пока не так будет важно и можно абстрагироваться от этого) просто запомнив что для map - make а для структур new) и хватит) потом в процессе просвещусь как нить