Путь Golang
411 subscribers
16 photos
2 files
37 links
Всё о Golang

Ресурсы и материалы: https://t.iss.one/waygolang/12

Кроме чата, Golang обсудить можно тут: https://t.iss.one/gogolang
Download Telegram
#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. Это упрощенная функция для выделения префикса и остатка
⚡️ Ой. В 1.18 в sync.(RW)Mutex появились методы Try(R)Lock()
ℹ️ Создавая канал, я конечно создал для себя список ресурсов, с которых я намеревался собирать информацию.

🇷🇺 Русскоязычные

• Канал Алексея Палажченко: 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, которые не позволили бы (в конце концов) дать реализацию, которая бы более напористо применяла мономорфизацию для встраивания или девиртуализации вызовов методов.
В go 1.18 новое поведение append. Ну как новое. Немного изменен алгоритм расчета. Сомневаюсь, что большинство из вас и старый знало (я в таких деталях не знал). Любое, даже маленькое изменение, очень важно само по себе. Но некоторые детали интересны в основном только для общего развития:
https://habr.com/ru/post/660827/
Сижу, готовлю пост о 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 #git #windows #ssh Часть I. Так получилось, что на работе мы используем Windows. Мне для одного проекта потребовалось использовать пакеты из приватных репозиториев. И из шкафа посыпались скелеты.

☝️ Современный 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
#go #git #windows #ssh Часть II. Так получилось, что на работе мы используем Windows. Мне для одного проекта потребовалось использовать пакеты из приватных репозиториев. И из шкафа посыпались скелеты.

... продолжение

🍐 Но что, если требуется использовать SSH (например, используется gitolite) и соотвественно с ключами SSH? Используем перенаправление:
git config --global url."ssh://[email protected]/".insteadOf "https://examples.com/"
Это заставит git использовать протокол SSH для выбранного URL.

🌶 Если ключ SSH можно хранить прямо на машине, то всё относительно просто. А вот если на ключе SSH должен стоять пароль, то начинаются вопросы. Нам требуется ssh-agent

На современных Windows 10 и 11 прямо в поставке идёт Windows-порт OpenSSH [5], его из коробки видит Git для Windows. Всё будет работать само. Кроме ssh-agent. После выполнения в PowerShell этих простых команд, в Windows появится сервис ssh-agent, который будет запускаться автоматически при перезагрузке компьютера [6][7]:
Get-Service -Name sshd | Set-Service -StartupType Automatic
Start-Service sshd
Командой ssh-add можно добавить ключи в агента. Никаких переменных окружения не надо настраивать. Современный агент работает через именованный канал (named pipe) [8]. Переменная SSH_AUTH_SOCK не используется ssh-agent в Windows.

В Windows OpenSSH ssh-agent запоминает добавленные ключи в реестр Windows, откуда считывает их при перезагрузке.Эти ключи может использовать только тот пользователь, который их добавил. Но если у пользователя Windows нет пароля, то ключ оказывается доступен для всех [9], и придется каждый раз удалять его через ssh-agent -d или ssh-agent -D

☣️ Этим недостатком не обладает старый добрый PuTTY. Можно настроить его.

☝️ Стандартная поставка Git для Windows включает команды start-ssh-agent.cmd и start-putty-agent.cmd. Представляют исторический интерес.

🏆 В современном Windows есть подсистема WSL2 (Windows Subsystem for Linux), и можно пользоваться ею. Ставим Windows Terminal (предупреждаю, без него без слез невозможно работать в Linux-консоли), инициализируем WSL2 [10] и просто работаем. Там и агент сразу запустится. С WSL2 умеют работать и vim, и VSCode [11] и GoLand [12]. Смотрите, для VSCode достаточно набрать code . внутри вашего воркспейса в WSL!

🛠 Важно! И PowerShell, и WSL2, и OpenSSH — это часть поставки Windows. Они просто есть. Windows Terminal является родной программой Microsoft, но в Windows 10 его придется через «Приложения Microsoft», а в Windows 11 он идет в поставке системы.

[5] https://docs.microsoft.com/en-us/windows-server/administration/openssh/openssh_install_firstuse
[6] https://docs.microsoft.com/en-us/windows-server/administration/openssh/openssh_keymanagement
[7] https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-service
[8] https://github.com/PowerShell/Win32-OpenSSH/issues/1136
[9] https://github.com/PowerShell/Win32-OpenSSH/issues/1487
[10] https://docs.microsoft.com/en-us/windows/wsl/install
[11] https://code.visualstudio.com/docs/remote/wsl
[12] https://www.jetbrains.com/help/go/2022.1/how-to-use-wsl-development-environment-in-product.html
#go #rnotes #release Go версии 1.19 вышел конечно несколько недель назад, но я всё же хочу на него обратить внимание:
https://go.dev/doc/go1.19

🤷‍♂️ В дженериках внезапно ничего нового не произошло

👍 Произошло знаковое событие — у Go наконец-то появилась описанная модель памяти. Что это? Это формализация поведения Go при конкурентной работе с переменными. Большинство статей про версию 1.19 делают акцент на этом и разбирают, что именно там внутри. Однако, в самом документе написано примерно следующее: «Если Вам необходимо прочитать этот документ — Вы слишком умный. Не будьте умным»
https://go.dev/ref/mem

📃 Go doc теперь умеет работать с простенькой разметкой. Т.е. можно делать заголовки, параграфы, внешние и внутренние ссылки, нумерованные и ненумерованные списки, и даже блоки кода. И go fmt умеет это проверять
https://go.dev/doc/comment

• Новый тег сборки //go:build unix, включающая в себя aix, android, darwin, dragonfly, freebsd, hurd, illumos, ios, linux, netbsd, openbsd, solaris

• Реализован soft memory limit — GC будет пытаться его соблюсти. Также теперь запускается несколько маленьких GC, вместо одного большого
https://go.dev/doc/gc-guide

‼️ Для новых горутин начальный размер стека теперь задается на основе статистики использования стека горутинами. Это к слову о пулах горутин

• На UNIX-системах RLIMIT_NOFILE теперь выставляется автоматом в максимально возможное значение при импорта пакета os

• Увеличена производительность конструкции switch за счет jump tables

В sync/atomic новые типы Bool, Int32, Int64, Uint32, Uint64, Uintptr, Pointer. Причем Pointer использует дженерики (первое использование в стандартной библиотеке), чтобы избежать конвертации в/из unsafe.Pointer

‼️ crypto/rand теперь сам не буферирует чтение. Обратите на это внимание

‼️ В принципе много мелких, но чувствительных изменений в crypto/*

Подарок всем, кто работает с разным IoT и бинарными данными. И fmt, и encoding/binary теперь оснащены функциями семейства Append*. Например можно сделать fmt.Appendf(buf, "%s", "карамба") или binary.BigEndian.AppendUint16(buf, modbusReg), прощай танцы вокруг bytes.Buffer

flag обзавелся функцией TextVar упрощающий задание типизированных данных в строках, типа IP-адреса, времени и так далее

• Результаты io.NopCloser и io.MultiReader теперь реализуют метод WriteTo

• В net/http теперь можно задаваемые пользователем коды 1xx в ResponseWriter.WriteHeader

В net/http появилась функция MaxBytesReader, обратите на неё внимание, так как сильно упрощает жизнь

• Любителям подуть щёки знанием алгоритмов сортировок — в sort он изменился

👍 В`time` Duration теперь умеет Abs. Очень полезно для проверки попадания в отрезок времени +-
#go #guide #google Google выпустил руководство по стилю написания кода на Golang. В Google:
https://google.github.io/styleguide/go/index

👉 Это три документа: общее руководство по стилю, расширенное руководство по каким-то конкретным темам и практики.

👉 Да, есть мнение, что это руководство «нормально делай — нормально будет» (c) Подольский. Документ действительно максимально насыщен и лаконичен. Выжимки делать трудно. Однако, почему-то заметное большинство коллег нормально не делает. А монструозное руководство с разжевыванием от Uber даже я не осилил: https://github.com/uber-go/guide/blob/master/style.md

☝️ Основные принципы стиля:
Читаемость. Это ПЕРВОЕ правило стиля
Простота
Лаконичность
Поддерживаемость
Согласованность

Читаемость. Код должен быть ясен для любого читающего. Два аспекта:
- Что код на самом деле делает?
• задавайте смысловые имена переменным;
• добавляйте дополнительные комментарии;
• разбивайте пробелами код и комментарии;
• раскладывайте код по разным функциям для модульности.
- Почему код делает то, что должен? Общий смысл в том, что понимание кода должно быть по мере чтения.
Приведен интересный на мой взгляд пример — функция strings.Cut, которая состоит из 4-ёх строк кода, но повышает в разы читаемость.

Простота
• код должен просто читаться сверху вниз;
• код не должен подразумевать, что читающий знает, что код делает;
• код не должен подразумевать, что читающий может запомнить весь предыдущий код;
• код не должен содержать не необходимых уровней абстракции;
• имена не должны отвлекать;
• все решения должны быть понятны читающему;
• комментарии должны описывать «почему», а не «что»;
• документация должна быть самодостаточной;
• код должен содержать понятные тестируемые ошибки;
• простой код часто противоречит «умному»;
• старайтесь использовать базовые конструкции языка (слайсы, мапы, структуры);
• если функция есть в стандартной библиотеке — используйте её;
• старайтесь использовать код Google.

Лаконичность
Приводится пример if err := doSomething(); err != nil { как пример лаконичного кода.

Поддерживаемость
Приводятся примеры всякого булшита, вроде игры областями видимости переменных или ! в середине выражения, которое конечно же пропускается при визуальном осмотре.

Согласованность
В целом, это про единообразие кода в рамках функции, файла, пакета, команды разработки, кодовой базы.

☝️ Руководство по стилю не заменяет effective Go https://go.dev/doc/effective_go , но расширяет его. «Не думайте, что Я пришел нарушить закон или пророков: не нарушить пришел Я, но исполнить.» (Мф. 5:17).

🫵 Стиль — это конёк golang на мой взгляд. Практики, руководства по практикам и стилям, доклады по практикам и стилям — всё в наших руках.
Forwarded from Эшер II A+
У Cloudflare есть промо-акция со скидкой на Yubikey (https://www.yubico.com/) 4x5NFC или 2x5CNFC до 31 декабря 2022:
https://www.cloudflare.com/press-releases/2022/cloudflare-democratizes-hardware-security-keys/

👉 Смысл в том, что если у вас был аккаунт на Cloudflare, даже бесплатный, то в теории вам дадут купон на скидку:
https://dash.cloudflare.com/?to=/:account/yubico-promotion
Говорите «хочу», и через пару дней вам приходит на email или промокод, или отказ.

☝️ Зачем? Это можно использовать для хранения SSH-ключей, и для всяких двухфакторных авторизаций (можно в каменты покидать популярные статьи получше):
https://habr.com/ru/company/ruvds/blog/659465/

‼️ Российские спецслужбы не реагируют на наличие таких ключей. Весь разработческий офис VK в них, триггером для силовиков не является.

😿 В России его всё равно купить нельзя. И я как-то подзабыл, что читатели не из России могут быть. И не делал поста. Простите. Но, может успеете.

‼️ Обратите на свои таможенные правила. В той же Турции эти ключи будут проходить растаможку и валяться сколько-то на таможне. В Евросоюз доставляется без вопросов.

🔥 Если у кого промокод есть, но не нужен — киньте мне. Я его может или себе возьму, или распределю нуждающимся.
🙀 На собеседовании кандидата на Go-разработчика есть смысл задавать ровно два вопроса:
• Какие технологические особенности есть у языка GO?
• Что такое и как работают go-рутины?

Правда, есть риск не найти разработчика в итоге.
#go #rnotes #release Go версии 1.20 вышел конечно полтора месяца назад, но я всё же хочу на него обратить внимание:
https://go.dev/doc/go1.20

🤷‍♂️ В дженериках внезапно ничего нового не произошло.

Появилась конвертация из слайса в массив простым способом: [4]byte(x). Создаётся копия. Зачем это надо? А например чтобы получить comparable.

🤷‍♂️ Теперь интерфейсы могут удовлетворять ограничению comparable. Живите теперь с этим.

👉 У go build появился ключ -cover. Туда же пакет runtime/coverage. Все это бурно пропустили в описаниях, а меня заинтересовало, потому что ничего не понял. Что-то про интеграционные тесты: https://go.dev/testing/coverage

🔥 Компилятор научился в магию оптимизации по профайлу (PGO). Создаёте профайл pprof, подсовываете компилятору и или всё стало работать быстрее, или всё стало работать медленнее.

• Новый пакет crypto/ecdh для обмена ключами Диффи-Хеллмана (я обращаю внимание на криптографию)

Появилась поддержка множественных ошибок. Внезапно можно вернуть несколько %w в fmt.Errorf или сделать errors.Join(err, ... errN). Остановлюсь поподробнее. Считаю вредной штукой. Обработка ошибок в go может и была странной, но была идиоматичной и вынуждала обработать таки ошибку. И чем раньше, тем лучше. Теперь появился инструмент "да я не знаю, что делать с ошибкой, потом подумаю". И потом сложный путь разбора. Все кейсы, которые я смог придумать с парной ошибкой, только запутывались таким решением. Пример из proposal вообще не выдерживает никакой критики. Давать отдельные ошибки на логин и пароль является антипаттерном. Ещё одной неприятностью является то, что множественные ошибки могут теперь создаваться из-за человеческой ошибки за счёт множественного %w. Живите теперь с этим (c)

👍 Экспериментальный, но интересный пакет arena про арены памяти. Хотел написать "не лезьте туда". Да лезьте, конечно. Просто ради интереса. Идея арены простая. Если у нас много мелких аллокаций, то можно взять сразу большой кусок памяти и делать это всё там. Принцип как в append - взять с "запасиком".

🍄 Пакет http предоставляет костыль http.ResponseController. Смысл в том, что в func RequestHandler(w ResponseWriter, r *Request) добавляется возможность немного поуправлять вот этим w. Flush там сделать, или Timeout поменять. Если, конечно, изначальный тип содержит соответствующие методы. Да, у http.ResponseController под капотом тайп свитчинг.

🙀 Пакет crypto/rsa теперь использует новые алгоритмы с постоянным временем работы. Шифрование стало примерно в 20 раз дольше. Но всё ещё в пять раз быстрее дешифрования. Живите теперь с этим (c)

‼️ В пакете math/rand внезапно seed делается сам при инициализации. Если вы ожидали повторяемости при запуске, то этого больше нет (хотя, в этом случае ты немного странный, друг). Привет, обратная совместимость! Функции Seed и Read стали устаревшими.

🧌 Какой-то релиз странный получился. Как-будто бы открылось "политическое окно для хрени"



🇱🇹 Кстати. Я могу какие-то части своих излияний переводить на литовский язык. Но не понимаю, насколько это вообще надо. И насколько применимо.
Forwarded from Эшер II A+
🔐☢️ Как-то прошла незаметно новость о том, что github.com поменял свой RSA SSH ключ:
https://github.blog/2023-03-23-we-updated-our-rsa-ssh-host-key/


👉 24 марта 2023 года около 05:00 UTC GitHub на всякий случай сменил RSA SSH ключ. Смена ключа произошла в результате обнаружения утечки секретного ключа в публичный git-репозиторий. ECDSA и ED25519 ключи не затронуты.

☝️ Вкратце. SSH ключ, о котором идёт речь, это SSH ключ самого сервера github.com. Когда пользователь сервиса хочет по SSH обратиться к репозиторию на github'е. это как бы тот ключ, который использует сервер. Если следовать всем правилам, надо получить слепок этого ключа доверенным способом и всегда сравнивать его. Обычно же, клиенты SSH предлагают сохранить его при первом соединении и так все и делают. Однако, даже такое «халявное» удостоверение хоста в большинстве случаев позволяет предотвратить атаку «мужик посерёдке» (MitM). Потому что слепок сохранён и если ключ вдруг на хосте поменяется, это вызовет ошибку при попытке нового соединения.

🙀 Как вы уже догадались, это должно было поломать кучу автоматики, пайплайнов CI/CD и так далее. Однако:
• Огромный срез параноиков не пользуется github. Не, некоторые и в пещерах живут, и это не плохо.
• Кто-то всё-таки живёт в 2023 году и использует ECDSA/ED25519
• Многие используют в CI/CD https. Несмотря на отсутствие такого у самого git, есть множество устоявшихся практик git over https. В том числе «проталкиваемых» самим github'ом
• Неимоверно много в скриптах -o StrictHostKeyChecking=no — игнорирование сравнения слепка ключа с запомненным. Какой дали, с тем и работаем.
• Админы утром проснулись, увидели поломанную автоматику, увидели что-то про хосткей в новостях, не глядя приняли новый ключ (мой случай) и пошли пить утренний кофе.

🫵 А у тебя сломался пайплайн? А сразу? А точно между тем как сломался и как работал, он работал с нужным ключом? На этой радостной ноте пожелаю всем labos nakties, как говорят тут.

⚡️ Новый ключ, чтобы не искать SHA256:uNiVztksCsDhcc0u9e8BujQXVUpKZIDTMczCvj3tD2s
#ИИ #Copilot #GPT4 🥂ИИ как товарищ и инструмент в руках программиста

Начну цикл постов про программирование и ИИ. Началось всё с того, что я хотел заставить ИИ нарисовать Башню Гедемина в будущем c космолётами. И так слово за слово купил доступ к разным ИИ...

Я расскажу вам как это стало для меня не просто инструментом, но и соратником, помогающим в разработке.
Я был поражён эффективностью ИИ и его способностью быть настоящим другом, который подсказывает решения и предлагает альтернативы, но при этом не делает всю работу за тебя. ИИ-технологии стали и хайпом, и в то же время неимоверно эффективным инструментом в умелых руках.

Начну с того, что может помочь вам прямо сейчас: GitHub Copilot. 10$+TAX в месяц — и он ваш.

Начало моего знакомства с Copilot было совершенно неожиданным. Однажды, активировав триальную версию, я забыл про неё. И вот пришло время поправить shell-скрипт, который, хоть и был важным, но второстепенным и не связанным с основным кодом на Golang. Начав писать функцию printdef () {, я был поражен, когда Copilot автоматически дополнил её всеми необходимыми echo и текстами. Этот момент настолько меня вдохновил, что я просидел часа три за непрерывным написанием кода, правками, написанием, улучшением, правками.

Использование: Установив Copilot как плагин в свой редактор кода (в моем случае, это VS Code), можно получать получать подсказки кода и автоматические предложения для комментариев к типам и интерфейсам, реализации рутинных функций и обработки ошибок. Copilot особенно полезен, когда код назван понятно и структурирован. И тут начинается цепная реакция — более хорошо описанный с помощью Copilot код помогает Copilot работать ещё лучше.

🔖 Если в VS Code в плагине Copilot провести мышкой поверх подсказки, то плагин подскажет клавиши управления. Сейчас можно принимать всю подсказку и пословно. А также листать варианты подсказок.

💚 Главным преимуществом Copilot является снижение рутины, что позволяет сфокусироваться на более сложных задачах.

Недостатки:
Copilot может допускать ошибки или предложить не совсем подходящий код. Или вообще не в тему. «Замечтался». Важно не торопиться и внимательно проверять предложенный Copilot код перед его использованием. Это позволяет успеть перехватить большинство ошибок. Умение отсеивать предложения AI и выбирать только подходящие решения становится одним из наиболее важных навыков для современного разработчика.

Советы для начинающих: Я бы рекомендовал начать использовать Copilot прямо сейчас, но не ждать от него чудес. Copilot отражает понятность вашего кода и обогащает его мировым опытом. Если код сложен и запутан, Copilot может быть менее полезным, или даже вредным. Так что всё зависит по прежнему от прослойки между клавиатурой и стулом, и от софт ИИ-скиллов.

💥 Я покидаю сюда прямо конкретных примеров, когда они будут у меня случаться. Если у вас есть какие-то понятные примеры — кидайте их мне, сделаем альбомчик «ИИ кодят»
#ИИ #Copilot #VSCode 💥 И сразу отличный короткий пример. Это вот это место: https://github.com/usher2/u2ckdump/blob/4ffca6caf7457840a969507b22e4ebd0a05f9ed4/parse.go#L19

☝️ Я поставил //, а Copilot серым описал, что это. Это действительно статистика последнего цикла разбора XML'ки.

🫵 Живите теперь с этим!
🖖 Ладно, пусть будет своя болталка
🔸 Коллега прислал ссылку на интересный проект. Пакет предоставляет возможность пользоваться функциями из библиотек разных систем. Насколько я понимаю, поддерживается пока только Darwin и Linux:
https://github.com/ebitengine/purego

🫴 Вместо тысячи слов:
func main() {
libc, err := purego.Dlopen(
getSystemLibrary(),
purego.RTLD_NOW|purego.RTLD_GLOBAL,
)
if err != nil {
panic(err)
}
var puts func(string)
purego.RegisterLibFunc(&puts, libc, "puts")
puts("Calling C from Go without Cgo!")
}

• Кросскомпиляция
• Динамическая подгрузка
• Отсутствие врапперов
🏆 Хотите конкурс на интерес? У меня есть.

Представьте банальную задачу. Ваш сервис что-то постоянно делает, Допустим раз в час обрабатывает какие-то данные и записывает их обработанными. Раз в месяц вы хотите сбросить какой-то счётчик. Раз в месяц от некой стартовой даты Tstart. Существуют два глобальных варианта:

• При старте и после каждого сброса счётчика записывать значение, когда надо сбросить счётчик, прибавив месяц — время Tx. Каждый раз проверять на now.Before(Tx)
• При старте и каждый сброс счётчика записывать текущее время. Каждую обработку проверять, не истёк ли месяц.

В обоих случаях надо или прибавить месяц, или отнять.

🥁 Банальщина какая-то. Давайте напишем функцию(и) добавления/вычитания месяцев к time.Time (не обязательно текущему). С тестами.

🤖 chatGPT можно и интересно. Но я попрошу опубликовать полный диалог с ним.

❗️ По возможности размещайте свой код на go.dev/play

💐 Лайк, шар, репост, вот это всё.

🐰 Внутренний голос сказал: «Вставай, иди на охоту, будет весело»
🔹 Уже вчера, 4 апреля 2023 года вышел минорный релиз Go 1.20.3:
https://go.dev/doc/devel/release#go1.20.minor

☑️ Из интересного — вроде бы он закрыл раздражавший в Dependabot alerts баг с возможностью DoS в net/http и там ещё целой пачке библиотек.

☝️ Кстати о Dependabot alerts. Вы ведь знаете о Dependabot? Мир программирования оброс конечно офигенными помощниками — подсветка кода, линтеры, Copilot... Dependabot — это github умеет сообщать вам, если в зависимостях вашего софта есть известные уязвимости. Фишку надо включить. Рекомендую
😎 Я хотел подготовить небольшое показательное выступление по chatGPT и получил смешное. «I see, you're looking for ways to integrate custom encryption into your Golang HTTP services at a higher level», — говорит мне Cylon. А потом мы полчаса толчём варианты. А дальше — картинка. «Девочка, что ты плетёшь?..» (c)