Язык программирования golang. Список полезных материалов Golang разработчика
Go (сокращёние от Golang) – это компилируемый многопоточный язык программирования с открытым исходным кодом. Его основной средой применения являются веб-сервисы и клиент-серверные приложения. В конце 2021 года Golang вошёл в топ 5 самых востребованных языков программирования.
Только начали изучать Go? Или никогда не пробовали программировать? Ничего страшного! Сегодня я предоставлю вам целый список полезных материалов, которыми я пользуюсь сам.
Ниже представлен порядок, которому я бы рекомендовал следовать при изучении языка Go:
- Tour of Go – ознакомьтесь с самыми базовыми азами Go
- How to Write Go Code – изучите объяснение того, как программировать на Go
- Effective go – источник, благодаря которому вы сможете ознакомиться со всеми основными понятиями
- Go 101 – одновременно с предыдущими источниками, вы можете начать знакомиться с книгой “Go 101” (600 страниц, содержащих полезные знания)
- Попробуйте самостоятельно написать небольшую программу
- Go Code Review Comments – прочитайте список проблем, которые могут возникать со стилем
- The Go Programming Language Specification – спецификация языка Golang, позволяющая заполнить все оставшиеся пробелы
- Go standard library – ознакомьтесь со стандартной библиотекой Golang
- Learning Go – можете прочитать это полезное пособие (тогда вам придётся его купить)
- Bonzai™ command tree – попробуйте создать дерево команд (очень полезный опыт)
Вам как можно скорее нужно начать разрабатывать свой собственный проект, который будет доставлять вам удовольствие. Это необходимо для поддерживания уровня мотивации учиться. Очевидно, что вы будете писать много своего собственного кода в промежутках между чтением книг. Но к тому времени, когда вы прочтете все это, одновременно занимаясь программированием, вы наверняка будете на пути к тому, чтобы стать мастером Go.
Я не буду перечислять здесь ничего, что имеет какой-либо платный доступ, включая книги, которые вы должны приобрести . Не каждый может найти деньги, чтобы платить за книги.
Образовательные ресурсы
Группа новостей USENET Go-Nuts.
https://groups.google.com/g/golang-nuts
Именно здесь создатели и руководители проекта Go регулярно отвечают на вопросы и обсуждают направление развития языка. Этот ресурс намного лучше, чем Reddit и даже официальный канал Go Discord (который вы можете найти на https://go.dev). Имейте в виду, что все, что когда-либо написано здесь, сохраняется навсегда, навсегда. Я предпочитаю это, потому что все материалы проходят модерацию, и люди на самом деле тратят время на то, чтобы обдумать то, что они пишут, прежде чем публиковать ядовитую чушь (в отличие от Reddit и Discord и т. д.).
Руководство Beej по сетевому программированию
https://beej.us/guide/bgnet
Книга написана на C, но многое из программирования на Go пересекается с этой областью — особенно с микросервисами — что чтение этой книги должно быть обязательным для разработчиков Go (или любого разработчика). Он охватывает такие вещи, как правильные семафоры файловой системы UNIX и другие проблемы архитектурного дизайна, о которых большинство людей, приходящих к программированию из академических кругов или иным образом, просто не думают интуитивно.
https://kristoff.it/blog/why-go-and-not-rust>
Это очень стоический и объективный взгляд на то, почему Go является языком корпоративных и облачных вычислений и почему он никогда не уступит эту позицию кому-то другому — особенно Rust. Я признаюсь, что раз или два подумал «ну да ладно», пока читал его, но многим новичкам и ветеранам может понадобиться прочитать очень практическую причину, почему Go — лучший инструмент для большинства вещей, а Rust, возможно, лучший. лучший инструмент для нескольких изолированных вещей, вот почему все самые важные программные приложения эпохи облаков и контейнеров были написаны на Go, а не на Rust, и, соответственно, почему существует множество рабочих мест для Go и почти нет для разработчиков Rust.
Protocol Buffers
https://developers.google.com/protocol-buffers
Формат Protobuf является обязательным для изучения для любого серьезного разработчика Go, желающего заняться микросервисами.
Другие полезные ресурсы.
jq
withoutjq
in Go code
https://github.com/thedevsaddam/gojsonq/v2jq
in Pure Go https://github.com/itchyny/gojq/This is used in the world-class, absolutely amazinggh
GitHub command line utility (and is the basis for thejq
Bonzai branch)- Tcell, Best Go Terminal Low-Level Library
https://github.com/gdamore/tcellPure-Go terminal “cell” (curses) library for text terminals; best in class at the moment - Tview, Best Go Terminal User Interface Library
https://github.com/rivo/tview
https://code.rocketnine.space/tslocum/cviewIt’s like having CSS in your terminal (but not); makes short work of terminal applications that need regularly used widgets, used by K9S and others;cview
, a forked version, is also good - Lodash in Go
https://github.com/samber/loIf you are intolodash
(from Node, I never was) you can try this; good for getting Go 1.18 ideas; seven times faster than equivalents using Go reflection - Grab, Highly Concurrent Downloads with Status
https://github.com/cavaliercoder/grabWhen you need really good download ability - Only Truly Safe Way to Write a File in Go
https://github.com/rogpeppe/go-internalThe internal libraries used by thego
binary itself; home oflockedfile
(proposed standard addition); truly safe writes to a file on all operating systems; (You’re probably doing it wrong. Creating a “lock” file is never enough.) - Protobuf Performant Serialization
https://github.com/protocolbuffers/protobufBest of breed way to turn a struct into a data stream or file and parse it (unmarshal) it back into a struct later; basis of gRPC and most Kubernetes communication; replaces JSON APIs for most things - Glamour, Themed Markdown Rendering for Terminal
https://github.com/charmbracelet/glamourThis is the same used forgh
. - modernc.org/sqlite
https://gitlab.com/cznic/sqlitePackage sqlite is a cgo-free port of SQLite. The 20% loss of performance is worth it for most people to have cross-compilation compatibility. - SQLX, the Missing SQL Package
https://github.com/jmoiron/sqlx
- 🌳 Go Bonzai™ Composite Commander
https://github.com/rwxrob/bonzaiA truly unique commander with recursive tab completion; no exported shell code required for completion; command aliases; multicall or monolith mode; rich embedded command documentation with markdown and templating; library of completers (files, dates, calculator); localized, modular configuration management; persisted variables to user local cache - 🌳 Go Bonzai™ Composite Command Example
https://github.com/rwxrob/bonzai-exampleA GitHub template you can copy and get started with creating your own monoliths and multicall binaries composed of your favorite Bonzai branches - 🌳 Personal Bonzai Command Tree Monolith
https://github.com/rwxrob/zMy own meticulously manicured monolith (myz
command) that I use hundreds of times a day. It’s becoming almost like a BusyBox Linux distro as more branches are added to it. Everything I write now is a Bonzai branch with a standalone, a high-level function library, and a composable branch Cmd. I can easily copy myz
to any system so I have all my favorite “scripts” — including bundled configurations forvim
,tmux
,lynx
and such (dot). By 2023, I hope to be 100% script free. - 🌳 Help Docs with Templates, Like
man
Pages
https://github.com/rwxrob/helpBundle your documentation with your Bonzai branch or tree withhelp.Cmd
; supports BonzaiMark, CommonMark templates (text/template
) with full set of common template functions; like Hugo for terminal apps. Includes pager detection with color support. - 🌳 Persist Variables to Portable Local Cache
https://github.com/rwxrob/varsBetter than environment variables; add scoped, persistent variables to any of your Bonzai branch or tree; .key=value properties value form for fastest-possible parsing (way faster than YAML/JSON; single file; standard user cache location; includes high-levelpkg
for use withoutbonzai
- 🌳 Local Configuration Management with YAML/JSON
https://github.com/rwxrob/confBuilt on the highly popular and performant yaml.v3 and yqlib; add persistent, manageable configuration to any Bonzai branch or tree; single file; edit with preferred local editor; includes high-levelpkg
for use withoutbonzai
- 🌳 Common Web Requests
https://github.com/rwxrob/webDrop-dead simple web requests with a strong high-level functionpkg
as well; never misscurl
again; (eventually, planned to take the place oflynx
for terminal based web browsing as well, built withtview
) - 🌳 GitHub Common Tasks (API)
https://github.com/rwxrob/githubJust a collection of my personal favorite and most needed GitHub API queries andgh
wrappers. Most people will want to use the amazing gh GitHub CLI instead (which can be extended for most things, just not these). Includeslatest
and release pushing, and more. - 🌳 KEG, Knowledge Exchange Graph PKG Utility
https://github.com/rwxrob/kegRethinking knowledge management and the Web from the perspective of lessons learned from software development over the last two decades. Provides lightning fast mind-mapping, creative zettelkasten note taking, indexing, publishing, and sharing with the KEG community of your choosing in any number of ways. If you love the command line, and need a CLI mind-mapping tool that works to produce GitHub compatible files and expands into full publications then you should really have a look. - 🌳 Go Helper Commands and Tasks
https://github.com/rwxrob/goodBuilding for multiple targets frombuild.yaml
file. - Easy Date/Time Formats with Duration Spans
https://github.com/rwxrob/dtimeThis package makes date and time offsets and durations drop-dead simple to calculate and enter from the command line or just tapped with thumbs into a phone. Uses PEG to define it’s grammar (and was the inspiration to create PEGN later). - Easy Input-Output Test Specifications in YAML
https://github.com/rwxrob/tinoutDesigned to make testing a large number of variations kept in a YAML file that also serve as documentation (inspired by the CommonMark specification and testing). - Pure Go secure shell (SSH) functions
https://github.com/rwxrob/sshCollection of functions employing thecrypto/ssh
package with sensible defaults enabling pure Go secure shell remote command calls. - Buffered Rune Scanner
https://github.com/rwxrob/scanA simple, highly performant buffered rune scanner; optimized for infinite lookahead/behind; designed with grammar creation in mind; optional trace logs to help debug complex scans - Functional Programming with Go Generics
https://github.com/rwxrob/fnMy own collection of map/filter/reduce/each-like things; great for rapid (replacing shell scripts) development; includes a tersefn.A
functional array type, library of map functions (mapf
), map transformations (maps
), and UNIX filters (filt
); (also see https://github.com/samber/lo - File and Directory Utilities
https://github.com/rwxrob/fsSupplements the standard filesystem functions with simplifications and extras that make rapid application development slightly less annoying in Go; be sure to uselockedfile
from https://github.com/rogpeppe/go-internal) for system-wide file locking. Includes extracting and cachingembed.FS
file systems. Includes transactional preservation. Includes multipart file marshaling. - Embed and Encapsulate Java JAR, Class, Java Files
https://github.com/rwxrob/javaImport and use Java directly into Go programs by embedding Java artifacts and extracting and caching them deterministically so that the only dependency isjava
on the system running the Go code. Make quick work of distributing Java applications withgo install
. Used to encapsulate the OpenAPITools generator. - 🌳 Java OpenAPI Generator Encapsulated in Go
https://github.com/rwxrob/openapiThis Bonzai branch includes the latestopenapi-generator-cli
embedded and cached within it along with an optional Dockerfile for building a container to work with OpenAPI 3.0 specifications and code and documentation generation. - JSON Done Right with Remote Source Marshaling
https://github.com/rwxrob/jsonFixes the very broken defaults inencoding/json
; includesAsJSON
interface; unmarshaling JSON directly from web via HTTP requests into any type that can be passed tojson.Unmarshal
by leveraging yaml.v3inline
(learned from the Kind project) - Marshal Anything as YAML
https://github.com/rwxrob/yamlA personal commitment to first marshal everything in YAML since yaml.v3 is so superior to anything available for JSON — especiallyyaml:",inline"
. I prefer to YAML all the config things and Protobuf all the performant data serialization things. JSON is unavoidable when consuming web APIs, however. - VT100 ANSI Terminal Utilities
https://github.com/rwxrob/termVT100 ANSI terminal escapes; no wasteful function calls just to change colors or terminal state; interactive terminal detection; window size queries; read visible and hidden user input - Bash
select
for Generic Slices
https://github.com/rwxrob/chooseIncludes sample fmt.Stringer implementation for different struct types. - Slug generator
https://github.com/rwxrob/slugBest of breed slug generation encapsulating the very popular simplego/slug. - Converter Utility Functions
https://github.com/rwxrob/toTransformations I find myself doing so much that they warrant their ownto
package module; string -> lines, etc. - Hybrid Data Structures with Generics
https://github.com/rwxrob/structsI use this everywhere. Having proper data structures is main reason I maintain a Bonzai command tree instead of a bunch of shell scripts.qstack
is usually better than Go slices for most applications;tree
is perfect for making ASTs and domain specific language parsing combined with https://github.com/rwxrob/scan) - 🌳 Universal Unique Identifiers
https://github.com/rwxrob/uniqThe usual universal unique identifiers:uuid
,isosec
,epoch
,base32
,hex
; includes high-levelpkg
library; essential for cobbling together flat-file data stores, etc. - 🌳 YAML to JSON Converter
https://github.com/rwxrob/y2jYAML to JSON conversion without the unnecessaryencoding/json
escapes (see rwxrob/json above); includespkg
with high-levelConvert
function - 🌳 Popular YAML Query Utility
https://github.com/rwxrob/yqThis is a duplicate of theyq
tool (with the sameyqlib
dependency); includespkg
with high-levelEvaluate
andEvaluateToString
functions with reasonable defaults; can be called from other Bonzai commands; dropped Cobra dependency