Forwarded from Let My Gophers Go!
Go Time!
Go Time — классный подкаст, посвященный Go и всему, что с ним связано. Иногда приходят даже члены Go Team и участвуют в AMA (ask me anything) сессиях.
Один из самых интересных эпизодов — Creating the Go Programming Language с участием Роба Пайка и Роберта Гризмера.
Мне не так легко в плане концентрации даются длинные подкасты, но, к счастью, у Go Time для каждого эпизода есть транскрипт.
Например, эпизод про создание Go можно не слушать, а прочитать здесь.
Помимо прочего, это ещё и отличная возможность начать активно слушать об интересной для себя тематике на английском. Все непонятное и "нерасслышанное" можно подсмотреть в скрипте и разобрать, если неизвестен перевод или правильное произношение.
Уже за несколько эпизодов можно сильно поднять как свой "технический" английский, так и восприятие на слух — а это очень пригодится на собеседовании, например. В общем, win-win.
Приятного прослушивания и чтения :)
Go Time — классный подкаст, посвященный Go и всему, что с ним связано. Иногда приходят даже члены Go Team и участвуют в AMA (ask me anything) сессиях.
Один из самых интересных эпизодов — Creating the Go Programming Language с участием Роба Пайка и Роберта Гризмера.
Мне не так легко в плане концентрации даются длинные подкасты, но, к счастью, у Go Time для каждого эпизода есть транскрипт.
Например, эпизод про создание Go можно не слушать, а прочитать здесь.
Помимо прочего, это ещё и отличная возможность начать активно слушать об интересной для себя тематике на английском. Все непонятное и "нерасслышанное" можно подсмотреть в скрипте и разобрать, если неизвестен перевод или правильное произношение.
Уже за несколько эпизодов можно сильно поднять как свой "технический" английский, так и восприятие на слух — а это очень пригодится на собеседовании, например. В общем, win-win.
Приятного прослушивания и чтения :)
Forwarded from Let My Gophers Go!
О канале
Кто-то однажды сказал, что лучший способ разобраться в предмете — не задать вопрос, а опубликовать абсолютно неверный ответ :)
Цели вводить в заблуждение у меня, конечно, нет, но мотивация похожая. Как понятно из описания канала, ни о какой авторитетности с моей стороны и речи быть не может. В канале я буду писать обо всем, в чем мне лично хотелось бы разобраться/не кажется очевидным. Я достаточно усерден (а иногда и чрезмерно дотошен) в плане ресерча и устранения неопределенности, поэтому таких моментов может быть достаточно много.
Обычное чтение не так хорошо работает, так как велик риск ничего не запомнить и споткнуться о тот же самый вопрос в будущем (проверено).
Другое дело — записывать как сам вопрос, так и свой "ответ" с результатами маленького исследования вопроса, к которым всегда можно вернуться. В общем, даже самый тупой карандаш лучше самой острой памяти :)
Прошу воспринимать все написанное здесь максимально строго и критично. Любой фидбэк крайне приветствуется, ведь именно это и является целью канала.
В свою очередь, буду периодически делиться всем полезным и интересным, что нахожу про Go (или не только). Читаю я регулярно, много, на двух языках, поэтому можно ожидать обновлений.
Let My Gophers Go! :)
Кто-то однажды сказал, что лучший способ разобраться в предмете — не задать вопрос, а опубликовать абсолютно неверный ответ :)
Цели вводить в заблуждение у меня, конечно, нет, но мотивация похожая. Как понятно из описания канала, ни о какой авторитетности с моей стороны и речи быть не может. В канале я буду писать обо всем, в чем мне лично хотелось бы разобраться/не кажется очевидным. Я достаточно усерден (а иногда и чрезмерно дотошен) в плане ресерча и устранения неопределенности, поэтому таких моментов может быть достаточно много.
Обычное чтение не так хорошо работает, так как велик риск ничего не запомнить и споткнуться о тот же самый вопрос в будущем (проверено).
Другое дело — записывать как сам вопрос, так и свой "ответ" с результатами маленького исследования вопроса, к которым всегда можно вернуться. В общем, даже самый тупой карандаш лучше самой острой памяти :)
Прошу воспринимать все написанное здесь максимально строго и критично. Любой фидбэк крайне приветствуется, ведь именно это и является целью канала.
В свою очередь, буду периодически делиться всем полезным и интересным, что нахожу про Go (или не только). Читаю я регулярно, много, на двух языках, поэтому можно ожидать обновлений.
Let My Gophers Go! :)
Forwarded from How to Go wrong (Alexey Palazhchenko)
В Twitter появилось сообщество по Go
🎃 Я когда-то решил сделать русскоязычный канал с оригинальным контентом и переводом иностранных ресурсов с актуальной информацией по Go. Я набрал источников, посмотрел на соседние русскоязычные каналы, составил план публикаций и...
⚔️ ... война внесла свои коррективы. Смыслы были потеряны или перевернуты, я подавлен и деморализован. Канал остался пустым. Но. Жизнь должна продолжаться
⚔️ ... война внесла свои коррективы. Смыслы были потеряны или перевернуты, я подавлен и деморализован. Канал остался пустым. Но. Жизнь должна продолжаться
#go #rnotes #release ⚡️⚡️⚡️ Вышел перенасыщенный новшествами go версии 1.18:
https://go.dev/doc/go1.18
Отмечу наиболее интересное:
• Дженерики 👽 Начало. Много отложено на 1.19
• К дженерикам прилагаются экспериментальные пакеты — аналоги стандартных, основанные на дженериках: x/exp/constraints , x/exp/slices и x/exp/maps
• В компиляторе исправлены давние косметические ошибки и некоторые программы, которые ранее компилировались, вдруг перестанут
• Изменения в garbage collector
• Новые оптимизации в компиляторе
• Оптимизация линковщика, уменьшающая размер бинарника
• Порт AMD64 умеет теперь выбирать разные наборы процессорных команд
• runtime/debug.ReadBuildInfo теперь содержит и информацию о системе контроля версий, которая была во время сборки
• Новый пакет net/ip. Поддерживает сравнение и может быть ключом
• В пакетах bytes и string новая функция Cut. Это упрощенная функция для выделения префикса и остатка
https://go.dev/doc/go1.18
Отмечу наиболее интересное:
• Дженерики 👽 Начало. Много отложено на 1.19
• К дженерикам прилагаются экспериментальные пакеты — аналоги стандартных, основанные на дженериках: x/exp/constraints , x/exp/slices и x/exp/maps
• В компиляторе исправлены давние косметические ошибки и некоторые программы, которые ранее компилировались, вдруг перестанут
• Изменения в garbage collector
• Новые оптимизации в компиляторе
• Оптимизация линковщика, уменьшающая размер бинарника
• Порт AMD64 умеет теперь выбирать разные наборы процессорных команд
• runtime/debug.ReadBuildInfo теперь содержит и информацию о системе контроля версий, которая была во время сборки
• Новый пакет net/ip. Поддерживает сравнение и может быть ключом
• В пакетах bytes и string новая функция Cut. Это упрощенная функция для выделения префикса и остатка
ℹ️ Создавая канал, я конечно создал для себя список ресурсов, с которых я намеревался собирать информацию.
🇷🇺 Русскоязычные
• Канал Алексея Палажченко: https://t.iss.one/HowToGoWrong
• Let My Gophers Go!: https://t.iss.one/letMyGophersGo
• Крупнейший русскоязычный чат: https://t.iss.one/gogolang
• Хабр: https://habr.com/ru/hub/go/
• Golang Piter Youtube: https://www.youtube.com/c/GolangPiter/featured
• GolangConf Youtube: https://www.youtube.com/c/GolangChannel
• Блог о языке программирования Go: https://golang-blog.blogspot.com/
🇺🇸 Англоязычные
• Официальный wiki с хорошо рубрицированной информацией — блоги, подкасты, доки, курсы, всё что угодно: https://github.com/golang/go/wiki/
• Еженедельный дайджест: https://golangweekly.com/issues/
• Очень крутой подкаст Go Time (рекомендую): https://changelog.com/gotime
• Очень крутой блог, на него ссылаются примерно все: https://dave.cheney.net/
• Неплохой блог: https://peter.bourgon.org/blog/
➡️ Не понимаю почему, многие блоги "закончились" в 2021 году...
🇷🇺 Русскоязычные
• Канал Алексея Палажченко: https://t.iss.one/HowToGoWrong
• Let My Gophers Go!: https://t.iss.one/letMyGophersGo
• Крупнейший русскоязычный чат: https://t.iss.one/gogolang
• Хабр: https://habr.com/ru/hub/go/
• Golang Piter Youtube: https://www.youtube.com/c/GolangPiter/featured
• GolangConf Youtube: https://www.youtube.com/c/GolangChannel
• Блог о языке программирования Go: https://golang-blog.blogspot.com/
🇺🇸 Англоязычные
• Официальный wiki с хорошо рубрицированной информацией — блоги, подкасты, доки, курсы, всё что угодно: https://github.com/golang/go/wiki/
• Еженедельный дайджест: https://golangweekly.com/issues/
• Очень крутой подкаст Go Time (рекомендую): https://changelog.com/gotime
• Очень крутой блог, на него ссылаются примерно все: https://dave.cheney.net/
• Неплохой блог: https://peter.bourgon.org/blog/
➡️ Не понимаю почему, многие блоги "закончились" в 2021 году...
Дженерики могут быть медленными. Интересная статья про внутренности реализации дженериков и влияние этой реализации на производительность кода. Перевод так себе, но смысл не искажает. Кому трудно читать выкладки — в конце статьи дана выжимка выводов:
https://habr.com/ru/post/660007/
НАДО и НЕ НАДО, касающихся производительности и дженериков в Go 1.18:
✅ НАДО пытаться делуплицировать идентичные методы, принимающие string и []byte, это делается при помощи ограничения ByteSeq. Генерируемая при этом форма очень похожа на результат написания двух почти идентичных функций вручную.
✅ НАДО использовать дженерики в структурах данных. Это с отрывом наилучший вариант их применения: обобщенные структуры данных, которые ранее реализовывались при помощи interface{}, сложны и неэргономичны. Удаляя утверждения типов и сохраняя типы неупакованными в типобезопасном виде, мы добиваемся, чтобы эти структуры данных становились как проще в использовании, так и производительнее.
✅ НАДО пытаться параметризовать функциональные помощники по типам их обратных вызовов. В некоторых случаях это может позволить компилятору Go выровнять их.
❌ НЕ НАДО пытаться использовать дженерики для девиртуализации или встраивания вызовов методов. Это не сработает, поскольку все типы указателей, которые могут быть переданы обобщенной функции, по форме одинаковы; ассоциированная с ними информация о методах находится в словаре, действующем во время выполнения.
❌ НЕ НАДО передавать интерфейс обобщенной функции, ни при каких обстоятельствах. Поскольку, учитывая, каким образом инстанцирование форм работает с интерфейсами, вы делаете не девиртуализацию, а добавляете лишний уровень виртуализации, для работы с которым приходится выполнять поиск в глобальной хеш-таблице на каждом вызове метода. При работе с дженериками в контексте, где важна производительность, используйте только указатели, но не интерфейсы.
❌ НЕ НАДО переписывать API, основанные на интерфейсах, переориентируя их на работу с дженериками. Учитывая нынешние ограничения реализации, любой код, который в настоящее время использует непустые интерфейсы, будет действовать более предсказуемо и при этом проще, чем если продолжать пользоваться интерфейсами. Что до вызовов методов, дженерики приводят к вырождению указателей в дважды опосредованные интерфейсы, а интерфейсы… во что-то весьма ужасное, честно говоря.
❌ НЕ НАДО отчаиваться и/или обливаться слезами, поскольку нет никаких технических ограничений в дизайне дженериков Go, которые не позволили бы (в конце концов) дать реализацию, которая бы более напористо применяла мономорфизацию для встраивания или девиртуализации вызовов методов.
https://habr.com/ru/post/660007/
НАДО и НЕ НАДО, касающихся производительности и дженериков в Go 1.18:
✅ НАДО пытаться делуплицировать идентичные методы, принимающие string и []byte, это делается при помощи ограничения ByteSeq. Генерируемая при этом форма очень похожа на результат написания двух почти идентичных функций вручную.
✅ НАДО использовать дженерики в структурах данных. Это с отрывом наилучший вариант их применения: обобщенные структуры данных, которые ранее реализовывались при помощи interface{}, сложны и неэргономичны. Удаляя утверждения типов и сохраняя типы неупакованными в типобезопасном виде, мы добиваемся, чтобы эти структуры данных становились как проще в использовании, так и производительнее.
✅ НАДО пытаться параметризовать функциональные помощники по типам их обратных вызовов. В некоторых случаях это может позволить компилятору Go выровнять их.
❌ НЕ НАДО пытаться использовать дженерики для девиртуализации или встраивания вызовов методов. Это не сработает, поскольку все типы указателей, которые могут быть переданы обобщенной функции, по форме одинаковы; ассоциированная с ними информация о методах находится в словаре, действующем во время выполнения.
❌ НЕ НАДО передавать интерфейс обобщенной функции, ни при каких обстоятельствах. Поскольку, учитывая, каким образом инстанцирование форм работает с интерфейсами, вы делаете не девиртуализацию, а добавляете лишний уровень виртуализации, для работы с которым приходится выполнять поиск в глобальной хеш-таблице на каждом вызове метода. При работе с дженериками в контексте, где важна производительность, используйте только указатели, но не интерфейсы.
❌ НЕ НАДО переписывать API, основанные на интерфейсах, переориентируя их на работу с дженериками. Учитывая нынешние ограничения реализации, любой код, который в настоящее время использует непустые интерфейсы, будет действовать более предсказуемо и при этом проще, чем если продолжать пользоваться интерфейсами. Что до вызовов методов, дженерики приводят к вырождению указателей в дважды опосредованные интерфейсы, а интерфейсы… во что-то весьма ужасное, честно говоря.
❌ НЕ НАДО отчаиваться и/или обливаться слезами, поскольку нет никаких технических ограничений в дизайне дженериков Go, которые не позволили бы (в конце концов) дать реализацию, которая бы более напористо применяла мономорфизацию для встраивания или девиртуализации вызовов методов.
Хабр
Дженерики могут замедлить ваш код на Go
Встречайте, вот и Go 1.18 , а с ней – первый релиз долгожданной реализации дженериков, наконец-то готовых к реальному использованию в продакшене. Дженерики – это весьма востребованная возможность,...
В go 1.18 новое поведение
https://habr.com/ru/post/660827/
append
. Ну как новое. Немного изменен алгоритм расчета. Сомневаюсь, что большинство из вас и старый знало (я в таких деталях не знал). Любое, даже маленькое изменение, очень важно само по себе. Но некоторые детали интересны в основном только для общего развития:https://habr.com/ru/post/660827/
Хабр
Изменения функции append в Go 1.18
Совсем недавно произошел релиз Go 1.18, гвоздем программы стали дженерики. Но про этот факт уже достаточно статей, а мне нечего к ним добавить. Однако, я не смог найти ни одного поста про этот кусочек...
Сижу, готовлю пост о Go 1.19 (я не тормоз, да), слушаю позапрошлый выпуск Go Time https://changelog.com/gotime/240 . Там некто Карл Джонсон https://carlmjohnson.net/ внезапно токает телегу про то, как он контрибьютит в GO. Собственно он говорит, что просто иногда садится, ищет какой-нибудь интересный для себя issue на github и просто пишет код на эту тему. Например, у него была маленькая библиотека для HTTP-запросов, и он внезапно видит issue от какого-то китайца с предложением функции URL.joinpath. Потом они обмениваются комментариями, потом кодом, и — ву-а-ля — функция готова! И дальше Карл пишет, что на Reddit часто люди спрашивают: "Как я могу начать контрибьютить? Какой есть хороший проект?" И Карл отвечает, что GO — хороший проект для этого. И что вот тот же URL.joinpath — это пара строчек кода и не надо быть гением.
И ведь это правда. Сколько в чатах вопросов — где можно постажироваться, какой есть проект для этого? GO — хороший ведь проект. Идите в issue и дерзайте!!
И ведь это правда. Сколько в чатах вопросов — где можно постажироваться, какой есть проект для этого? GO — хороший ведь проект. Идите в issue и дерзайте!!
Changelog
What's new in Go 1.19 with Carl Johnson (Go Time #240)
Go 1.18 was a major release where we saw the introduction of generics into the language as well as other notables such as fuzzing and workspaces. With Go 1.19 slated to come out next month, one has to wonder what’s next. Are we in store to be blown away by…
#go #git #windows #ssh Часть I. Так получилось, что на работе мы используем Windows. Мне для одного проекта потребовалось использовать пакеты из приватных репозиториев. И из шкафа посыпались скелеты.
☝️ Современный GO умеет работать с Git, Subversion, Mercurial, Bazaar, и Fossil [1], но я рассматриваю только Git.
👉 Отмечу одну важную деталь:
🍏 Первый способ заключается в сохранении логина и пароля через настройку конфигурации [3]:
или
Продолжение дальше...
[1] https://go.dev/ref/mod
[2] https://proxy.golang.org/
[3] https://git-scm.com/docs/gitcredentials
[4] https://git-scm.com/docs/git-config#Documentation/git-config.txt-urlltbasegtinsteadOf
☝️ Современный GO умеет работать с Git, Subversion, Mercurial, Bazaar, и Fossil [1], но я рассматриваю только Git.
👉 Отмечу одну важную деталь:
go mod ...
и go get ...
«ходят» не напрямую в ваш репозиторий, а через прокси, контролируемый значением переменной GOPROXY. Посмотрите, что говорит go env
[2]. GO не просто пользуется прокси, а сверяет с базой контрольных сумм из переменной GOSUMDB. Переменные GONOPROXY и GONOSUMDB указывают, для каких путей импорта не будет использоваться прокси и/или база сумм. Переменная GOPRIVATE перечисляет пути импорта, для которых не будут использоваться ни прокси, ни суммы. Работу с приватными репозиториями следует начинать с настройки GOPRIVATE, ключ -w
запишет переменную:go env -w GOPRIVATE="git.mysecret.com/myrepo,git.supersecret.com"
🌧 Подвох кроется в том, что GO подавляет ввод пароля при работе с git. Что-то с этим придется делать. 🍏 Первый способ заключается в сохранении логина и пароля через настройку конфигурации [3]:
git config credential.helper store
или
git config credential.helper cache
Затем надо «поработать» с нужными приватным репозиториями напрямую командами git, чтобы он запросил, а затем запомнил логин/пароль: git clone
или git pull
или git push
В случае store git запомнит логин/пароль в файл, в случае cache — временно в память. Строго говоря, там довольно гибкая система этих credentials, можете почитать для себя. Это работает для доступа по https (умолчание). Можно сразу задать пользователя:git config credential.https://example.com.username myusername
Ещё один способ — указать git переписывать URL [4]: git config --global url."https://api:$[email protected]/".insteadOf "https://github.com/"
🍐 Но что, если требуется использовать SSH (например, используется gitolite) и соответственно с ключами SSH? ...Продолжение дальше...
[1] https://go.dev/ref/mod
[2] https://proxy.golang.org/
[3] https://git-scm.com/docs/gitcredentials
[4] https://git-scm.com/docs/git-config#Documentation/git-config.txt-urlltbasegtinsteadOf