Compare commits

...
47 Commits
Author SHA1 Message Date
Dariush AbbasiandGitHub 663df50585 Merge pull request #178 from kirinyoku/master
remove non-existent books from russian readme
2026-07-13 19:38:02 +03:30
OleksandrandGitHub 41dc279cb9 remove non-existent books from russian readme
Books by Anton Polyak and Maxim Petrenko do not exist. Removed them to prevent confusing users.
2026-07-11 13:16:34 +02:00
Hassan Aminfar 65b77dc103 fix: links and typos
Fix Shipping Go cover image path.
2026-07-09 08:17:45 -06:00
Dariush AbbasiandGitHub b29194fb30 update top books 2026-06-05 11:57:50 -06:00
Hassan Aminfar eac444c386 Add Boring Go book 2026-04-25 21:18:26 +03:30
Dariush Abbasi 2997e056e5 add golang books lists in other languages
ref #163
2026-02-27 05:58:53 -07:00
Dariush Abbasi 14d057ae7b remove shitty toc, make it simple
ref #163
2026-02-27 05:27:58 -07:00
Dariush Abbasi cfb82c17a1 sort new to old
ref #163
2026-02-27 05:23:44 -07:00
Dariush AbbasiandGitHub c92ebe167d Add Most Popular Section
Updated README.md to include new sections and correct formatting issues.

ref #163
2026-02-27 03:05:12 -07:00
Dariush Abbasi 60cf0b8ccf add validator as github action 2026-02-07 07:30:44 -07:00
Dariush Abbasi 4360f8fa4a Makefile for running validator 2026-02-07 07:25:50 -07:00
Dariush Abbasi 158028eeba add custom readme validator of gobooks 2026-02-07 07:25:27 -07:00
Dariush Abbasi b5710293d4 update all books with new structure
ref #163
2026-02-07 05:49:01 -07:00
Dariush Abbasi 2ab1ffbcaa remove BS link checker 2026-02-07 05:46:27 -07:00
Dariush Abbasi b41391c9f9 Upadte Starter Books with new structure
ref #163
2026-02-07 02:55:03 -07:00
Dariush AbbasiandGitHub 4db0a75644 Add DevBooks and AIBooks to related lists 2026-01-29 10:55:00 +03:30
Dariush AbbasiandGitHub 3a276e59f8 update badges location in README for project status
Added badges for GitHub Actions and Awesome list.
2026-01-28 04:01:15 -07:00
Dariush AbbasiandGitHub 6d850f794f Enhance README with GoBooks description
Added a detailed description of GoBooks to the README.
2026-01-28 04:00:36 -07:00
Dariush AbbasiandGitHub 54f4a2b90d Add related lists
Added related lists, start with JavaScript, PostgreSQL, and Python books.
2026-01-28 03:54:43 -07:00
Dariush AbbasiandGitHub 9da6c4589c Merge pull request #161 from bitfield/bitfield-patch-1-1
"The deeper love of Go" has replaced "For the love of Go."
2025-11-20 13:30:55 +03:30
Dariush AbbasiandGitHub da9645dff2 Merge pull request #160 from rezmoss/master
updated the book entry for go at scale, go pattern now has a new name
2025-11-19 13:15:30 +03:30
John ArundelandGitHub 94b721283d "The deeper love of Go" has replaced "For the love of Go." 2025-10-23 13:59:06 +01:00
Rez MossandGitHub aea5794085 update book entry Go at scale 2025-06-28 08:46:43 -04:00
Rez MossandGitHub d2666e42af Merge branch 'dariubs:master' into master 2025-06-28 08:37:46 -04:00
d0efda0d3f Added 'The Go Programming Language' book to the GoBooks repository (#158)
Co-authored-by: GURUAKASH-KULU <guruakaash@kulu.com>
2025-04-05 13:07:30 -06:00
Rez MossandGitHub 6c05409e21 Add Pro Go Patterns (#156)
* Pro Go Patterns

* Pro Go Patterns
2025-02-06 19:27:41 -07:00
Rez MossandGitHub 6044925c0e Pro Go Patterns 2025-02-06 21:16:37 -05:00
Rez MossandGitHub 1f8fa1a7ca Pro Go Patterns 2025-02-06 21:10:42 -05:00
Bob ConanandGitHub ae896f2278 Updated README.md, fix typo(s) (#154) 2024-11-09 00:44:00 -07:00
Volodymyr ProkopyukandGitHub 04113c51e6 Practical guide for building a blockchain from scratch in Go with gRPC (#153)
* advanced: add the guide for building a blockchain from scratch in Go with gRPC

The README.org of the repository contains the table of contents with links to 11 chapters under the doc/ directory

* toc: fix the link for the guide in the TOC
2024-10-20 10:33:10 -06:00
1690e6b1e3 Rename Effective Go to Go by Example. Remove MEAP status from Build an Orchestrator in Go and 100 Go Mistakes. (#152)
Co-authored-by: stepan <s.leas@developmentaid.org>
2024-10-20 09:10:42 -06:00
JohnathanandGitHub 63b9e87703 Remove DSA book from webdev topic (#151) 2024-10-18 00:24:29 -06:00
Nicolas LeivaandGitHub 1bf3d2be72 Add Network Automation with Go (#150) 2024-10-11 10:17:44 -06:00
tobiasgjerstrupandGitHub 5e596b17fe Fixed broken anchor link (#149) 2024-10-03 23:03:25 -06:00
AndyDHainesandGitHub cc5951f33f Update README.md (#148)
Added the Go Programming - From Beginner to Professional: Learn everything you need to build modern software using Go, Second Edition Book to the list of beginner books
2024-09-03 17:20:18 -06:00
leedrumandGitHub 4e86eab1f7 Fixed anchor link gRPC Microservices in Go (#147) 2024-08-11 15:16:19 -06:00
Christoph JasinskiandGitHub f8fd6943bc Added "Mastering Go, 4th edition" (#146) 2024-04-17 17:44:41 -06:00
461fe1235b Update images for two manning books and move one to the end of the year (#145)
Co-authored-by: stepan <s.leas@developmentaid.org>
2024-04-07 09:29:51 -06:00
vrv501andGitHub 9eaac32ead Add Updated Edition for O'Reilly Idiomatic Go (#144)
* Update README.md

* Update README.md

* Update README.md

* Update README.md
2024-04-06 09:34:35 -06:00
AbhishekandGitHub 677f5fcd3d Update README (#143) 2024-03-02 14:15:44 -07:00
John ArundelandGitHub 36392bed38 Add 'Explore Go: Cryptography' (#142)
* Add 'Explore Go: Cryptography'

* Update cover image links
2024-01-31 17:10:14 -07:00
Mohammadi, ErfanandGitHub 00946f3322 Add Head First Go (#139) 2023-11-22 07:28:27 -07:00
Nathan Youngman 16817fcc85 small tweaks 2023-09-02 18:15:26 -06:00
Nathan Youngman a17bd166c3 badge 2023-09-02 18:09:38 -06:00
Nathan Youngman 9c0798c520 lychee: accept 401
https://github.com/lycheeverse/lychee/issues/1157
2023-09-02 18:06:50 -06:00
Nathan Youngman f6c4e7158d Adjust GitHub Actions trigger 2023-09-02 18:02:46 -06:00
Nathan YoungmanandGitHub 9457b93969 Switch Link Checker to Lychee (#137)
* Switch Link Checker to Lychee

It’s fast and can handle more links

* Udemy reports 403

https://github.com/lycheeverse/lychee/issues/1157

* trigger
2023-09-02 17:59:10 -06:00
81 changed files with 1668 additions and 367 deletions
-18
View File
@@ -1,18 +0,0 @@
name: AwesomeBot
# Controls when the workflow will run
on:
# Triggers the workflow on push or pull request events but only for the master branch
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: ruby/setup-ruby@v1
with:
ruby-version: 2.5.3
- run: gem install awesome_bot
- run: awesome_bot README.md --allow-dupe --allow-redirect
+21
View File
@@ -0,0 +1,21 @@
name: Validate README
on:
push:
branches: [master, main]
pull_request:
branches: [master, main]
jobs:
validate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: "1.21"
- name: Run validator
run: make -C gobooks validate
-1
View File
@@ -1 +0,0 @@
ab*.json
+22 -2
View File
@@ -1,18 +1,38 @@
Contribution Guidelines
====
Add books with this format :
## Adding a book to the main list
Add books with this format:
```
### DATE - [BOOK NAME](BOOK URL)
<img src="BOOK COVER IMAGE ADDRESS" width="120px"/>
<img src="gobooks/covers/COVER_FILENAME" width="120px"/>
BOOK DESCRIPTION
```
* Place cover images in `gobooks/covers/` with a slug filename (e.g. `book-name.jpg`).
* If book is free, add it after free books of that category and also add `*Free*` after book url.
* Add other books in ascending date order (newest last). Books without date go at the end of the list in that category.
* To keep track of the huge table of contents you can use a plugin like [Markdown VSCode plugin](https://marketplace.visualstudio.com/items?itemName=yzhang.markdown-all-in-one)
## Adding a book in another language
If a Go book exists in a language that already has a page (`gobooks/README-<lang>.md`), add it to that file using the same format as the main list. Write the book description in that language. Cover images go in `gobooks/covers/` as usual.
## Adding a new language
If no page exists yet for a language:
1. Create `gobooks/README-<lang>.md` using the [ISO 639-1](https://en.wikipedia.org/wiki/List_of_ISO_639_language_codes) language code (e.g. `README-ja.md` for Japanese).
2. Use the title **Go Books** translated into that language as the page heading (e.g. `# Go ブックス`).
3. Write the introductory description in that language. Keep it simple: state that this is a complete list of Go books available in that language.
4. List books using the same card format as the main README. All descriptions must be written in that language.
5. For right-to-left languages (Arabic, Farsi, Hebrew, etc.), wrap the entire content in `<div dir="rtl"> ... </div>`.
6. Add a link to the new page in the language bar at the top of `README.md`:
```
**Other languages:** ... · [Language name in its own script](gobooks/README-<lang>.md)
```
+809 -346
View File
File diff suppressed because it is too large Load Diff
+23
View File
@@ -0,0 +1,23 @@
# Binaries
validator/validator
validator/validator.exe
*.exe
*.dll
*.so
*.dylib
# Go
*.test
*.out
go.work
# IDE
.idea/
.vscode/
*.swp
*.swo
*~
# OS
.DS_Store
Thumbs.db
+3
View File
@@ -0,0 +1,3 @@
.PHONY: validate
validate:
cd validator && go run . ../../README.md
+78
View File
@@ -0,0 +1,78 @@
# Go-Bücher (Deutsch)
[![Awesome](https://cdn.rawgit.com/sindresorhus/awesome/d7305f38d29fed78fa85652e3a63e154dd8e8829/media/badge.svg)](https://github.com/sindresorhus/awesome)
Dies ist eine vollständige Liste der **auf Deutsch verfügbaren Go-Bücher**, die offiziell in deutscher Sprache erschienen sind.
---
### [Go programmieren für Dummies](https://www.wiley-vch.de/de/fachgebiete/informatik/go-programmieren-fuer-dummies-9783527714239)
*Erscheinung*: **2022**
*Autor*: **Wei-Meng Lee**
*Verfügbar als*: **Druckausgabe**, **eBook**
*Sprache*: **Deutsch**
Ein praxisorientiertes Einsteigerbuch, das Grundkonzepte der Programmiersprache Go erklärt und den Einstieg in die Go-Programmierung erleichtert.
-----
### [Programmiersprache „Go“ und Ökosysteme](https://www.thalia.de/shop/home/artikeldetails/A1062910674)
*Erscheinung*: **2021**
*Autor*: **Christopher Peters**
*Verfügbar als*: **Taschenbuch**
*Sprache*: **Deutsch**
Ein kurzes Buch über die Programmiersprache Go und ihr Ökosystem, das grundlegende Ideen und Anwendungsbereiche in deutscher Sprache vorstellt.
-----
### [Nichtsequentielle und Verteilte Programmierung mit Go](https://link.springer.com/book/10.1007/978-3-658-25369-9)
*Erscheinung*: **2019**
*Autor*: **Christian Maurer**
*Verfügbar als*: **Druckausgabe**, **eBook**
*Sprache*: **Deutsch**
Ein fortgeschritteneres Buch, das sich mit nebenläufiger und verteilter Programmierung mit Go befasst.
-----
### [Einstieg in Google Go](https://www.amazon.de/dp/3864900771)
*Erscheinung*: **2012**
*Autoren*: **Christian Himpel**, **Mario Deilmann**
*Verfügbar als*: **eBook**
*Sprache*: **Deutsch**
Ein älteres Einsteigerbuch zu Go, geeignet für Entwickler, die die Grundlagen der Sprache lernen möchten.
-----
### [Programmierung in Google Go](https://www.amazon.de/dp/3868020032)
*Erscheinung*: **2010**
*Autoren*: **Rainer Feike**, **Steffen Blass**
*Verfügbar als*: **Druckausgabe (vergriffen)**
*Sprache*: **Deutsch**
Ein älteres deutschsprachiges Go-Buch, das heute nur noch antiquarisch erhältlich ist.
-----
## Mitwirken
Wenn du ein weiteres offiziell **auf Deutsch erschienenes Go-Buch kennst**, das hier fehlt, kannst du gerne eine Ergänzung vorschlagen.
## Lizenz
<a rel="license" href="https://creativecommons.org/licenses/by/4.0/">
<img alt="Creative Commons License" style="border-width:0" src="https://i.creativecommons.org/l/by/4.0/88x31.png" />
</a><br />
Dieses Werk ist lizenziert unter einer
<a rel="license" href="https://creativecommons.org/licenses/by/4.0/">
Creative Commons Namensnennung 4.0 International Lizenz
</a>.
[← Zurück zur Hauptliste](https://github.com/dariubs/GoBooks)
+63
View File
@@ -0,0 +1,63 @@
# Libros de Go (en español)
[![Awesome](https://cdn.rawgit.com/sindresorhus/awesome/d7305f38d29fed78fa85652e3a63e154dd8e8829/media/badge.svg)](https://github.com/sindresorhus/GoBooks)
Esta es una lista de libros sobre Go que se encuentran **disponibles en español**.
---
### 📘 **Programación en Go** *Mario Macías Lloret*
*Última publicación*: **2021**
*Autor*: **Mario Macías Lloret**
*Disponible como*: **Impreso**, **eBook**
*Idioma*: **Español**
Un libro orientado a principiantes y desarrolladores que quieren aprender Go desde cero, cubriendo desde conceptos básicos hasta temas intermedios de Go. :contentReference[oaicite:0]{index=0}
-----
### 📙 **Golang para Principiantes: Fundamentos** *(Spanish Edition)*
*Última publicación*: **publicación reciente**
*Autor*: *(varios/autores autopublicados)*
*Disponible como*: **eBook**
*Idioma*: **Español**
Libro pensado para quienes se inician en Go, con explicación de conceptos básicos de forma clara y sencilla. :contentReference[oaicite:1]{index=1}
-----
### 📗 **Desarrolla tu Carrera en Go: Programación en Golang** *(en español)*
*Última publicación*: **publicación reciente**
*Autor*: **Francisco Alexander López Garrido**
*Disponible como*: **eBook**
*Idioma*: **Español**
Guía completa para aprender Go desde la instalación hasta conceptos avanzados. :contentReference[oaicite:2]{index=2}
-----
## 📌 Notas importantes
- Existen también recursos gratuitos y sin ISBN en español como *Aprende Go en Y minutos* o varios tutoriales en GitHub, pero **no son libros formales con ISBN**. :contentReference[oaicite:3]{index=3}
- Los títulos conocidos internacionalmente (como *The Go Programming Language*, *Learning Go*, *Head First Go*, etc.) **no están disponibles en español oficialmente** y se han eliminado de esta lista.
---
## 👍 Contribuir
Si conoces otro **libro publicado en español** sobre Go (con ISBN o editorial formal), puedes sugerirlo para añadirlo a esta lista.
## 📜 Licencia
<a rel="license" href="https://creativecommons.org/licenses/by/4.0/">
<img alt="Creative Commons License" style="border-width:0" src="https://i.creativecommons.org/l/by/4.0/88x31.png" />
</a><br />
Este trabajo está bajo una licencia
<a rel="license" href="https://creativecommons.org/licenses/by/4.0/">
Creative Commons Atribución 4.0 Internacional
</a>.
[← Volver a la lista principal](https://github.com/dariubs/GoBooks)
+38
View File
@@ -0,0 +1,38 @@
<div dir="rtl">
# کتاب‌های Go (فارسی)
[![Awesome](https://cdn.rawgit.com/sindresorhus/awesome/d7305f38d29fed78fa85652e3a63e154dd8e8829/media/badge.svg)](https://github.com/sindresorhus/awesome)
این فهرست کاملی از کتاب‌های **منتشرشده به زبان فارسی** درباره Go است.
---
### [زبان برنامه‌نویسی Go](https://book.gofarsi.ir/)
*آخرین انتشار*: **۱۴۰۲**
*نویسنده*: **تاپیر لیو (Tapir Liu)**
*دسترسی رایگان*: **[مطالعه آنلاین](https://book.gofarsi.ir)**
*زبان*: **فارسی**
اولین کتاب متن‌باز فارسی درباره زبان Go. در این کتاب، مباحث زبان Go از سطح مقدماتی تا پیشرفته پوشش داده شده است. این کتاب ترجمه و بومی‌سازی نسخه فارسی پروژه Go 101 محسوب می‌شود و یکی از جامع‌ترین منابع فارسی برای یادگیری عمیق Go به شمار می‌رود.
-----
## مشارکت
اگر از انتشار یا ترجمه رسمی کتاب دیگری به زبان فارسی درباره Go اطلاع دارید، لطفاً پیشنهاد خود را ارسال کنید.
## مجوز
<a rel="license" href="https://creativecommons.org/licenses/by/4.0/">
<img alt="Creative Commons License" style="border-width:0" src="https://i.creativecommons.org/l/by/4.0/88x31.png" />
</a><br />
این اثر تحت مجوز
<a rel="license" href="https://creativecommons.org/licenses/by/4.0/">
Creative Commons Attribution 4.0 International
</a> منتشر شده است.
[← بازگشت به فهرست اصلی](https://github.com/dariubs/GoBooks)
</div>
+61
View File
@@ -0,0 +1,61 @@
# Livros de Go (em português)
[![Awesome](https://cdn.rawgit.com/sindresorhus/awesome/d7305f38d29fed78fa85652e3a63e154dd8e8829/media/badge.svg)](https://github.com/dariubs/GoBooks)
Esta é uma lista completa dos **livros de Go publicados em português**.
---
### 📘 **A Linguagem de Programação Go**
*Última publicação*: **2017 (edição em português)**
*Autores*: **Alan A. A. Donovan** e **Brian W. Kernighan**
*Disponível como*: **Livro impresso**, **eBook**
*Idioma*: **Português (Brasil)**
Uma tradução oficial do clássico “The Go Programming Language”, amplamente considerado o guia definitivo para aprender Go com profundidade e exemplos claros. :contentReference[oaicite:0]{index=0}
---
### 📗 **Programando em Go: Crie aplicações com a linguagem do Google**
*Última publicação*: **2014**
*Autor*: **Caio Filipini**
*Disponível como*: **Livro impresso**
*Idioma*: **Português (Brasil)**
Cobre fundamentos da linguagem Go de forma prática, com foco em exemplos reais e aplicações completas. :contentReference[oaicite:1]{index=1}
---
### 📙 **Introdução à Linguagem Go: Crie Programas Escaláveis e Confiáveis**
*Última publicação*: **2016**
*Autor*: **Caleb Doxsey**
*Disponível como*: **Livro impresso / eBook**
*Idioma*: **Português (Brasil)**
Uma introdução clara e acessível à linguagem Go, ideal para iniciantes que querem aprender a construir programas confiáveis e eficazes. :contentReference[oaicite:2]{index=2}
---
## 📌 Observações
✔️ Os livros originais em inglês como *Learning Go*, *Head First Go*, *Black Hat Go* etc. **não foram incluídos aqui**, pois **não têm edições oficiais em português**.
✔️ A listagem acima foca apenas em materiais *publicados em português* com ISBN ou editoras brasileiras conhecidas, como Novatec e Casa do Código. :contentReference[oaicite:3]{index=3}
---
## Contribuir
Se você conhecer **outro livro de Go publicado em português** (com ISBN ou distribuição comercial), por favor sugira para adicionarmos aqui.
## Licença
<a rel="license" href="https://creativecommons.org/licenses/by/4.0/">
<img alt="Creative Commons License" style="border-width:0" src="https://i.creativecommons.org/l/by/4.0/88x31.png" />
</a><br />
Este trabalho está licenciado sob uma
<a rel="license" href="https://creativecommons.org/licenses/by/4.0/">Creative Commons Atribuição 4.0 Internacional</a>.
[← Voltar à lista principal](https://github.com/dariubs/GoBooks)
+43
View File
@@ -0,0 +1,43 @@
# Книги по Go (на русском)
[![Awesome](https://cdn.rawgit.com/sindresorhus/awesome/d7305f38d29fed78fa85652e3a63e154dd8e8829/media/badge.svg)](https://github.com/dariubs/GoBooks)
Это список книг по Go, которые **официально изданы на русском языке**.
---
### 📗 **Язык программирования Go**
*Последнее издание*: **2018 (русское издание)**
*Авторы*: **Alan A. A. Donovan** и **Brian W. Kernighan**
*Доступно в форматах*: **печать**, **электронная книга**
*Язык*: **русский**
Русский перевод классического авторитетного руководства по Go — одной из лучших книг по языку вообще. Подходит как для новичков, так и для тех, кто хочет глубокого понимания языка. (Источник: магазины книг на русском)
---
## 📌 Обратите внимание
✔️ Многие известные книги по Go (например, *Learning Go*, *Head First Go*, *Black Hat Go*, *Go 101* и др.) **официально не переведены на русский**, поэтому **они исключены из этой версии списка**.
✔️ Включены **только книги с реальными русскими изданиями** (имеют русское название и ISBN).
---
## 💡 Хотите помочь?
Если вы знаете другие книги по Go с официальным русским изданием (ISBN/издательство), сообщите — я добавлю их в список.
---
## 📜 Лицензия
<a rel="license" href="https://creativecommons.org/licenses/by/4.0/">
<img alt="Creative Commons License" style="border-width:0" src="https://i.creativecommons.org/l/by/4.0/88x31.png" />
</a><br />
Это произведение лицензировано по
<a rel="license" href="https://creativecommons.org/licenses/by/4.0/">
Creative Commons Attribution 4.0 International
</a>.
[← Вернуться к основной Awesome-списку](https://github.com/dariubs/GoBooks)
+133
View File
@@ -0,0 +1,133 @@
# Go 书籍(中文)
[![Awesome](https://cdn.rawgit.com/sindresorhus/awesome/d7305f38d29fed78fa85652e3a63e154dd8e8829/media/badge.svg)](https://github.com/dariubs/GoBooks)
这是目前所有**正式出版或广泛存在的中文 Go 语言书籍**列表。
---
### 📘 《Go 程序设计语言(中文版)》
*中文出版时间***2017(译本)**
*原作者***Alan A. A. Donovan、Brian W. Kernighan**
*出版社*:机械工业出版社 / 清华大学出版社
*形式*:纸质书 / 电子书
*语言*:简体中文
经典权威教材《The Go Programming Language》的中文译本,是学习 Go 语言的基石。:contentReference[oaicite:1]{index=1}
---
### 📗 《Go 语言高级编程》
*中文出版时间***2019**
*作者***柴树杉、曹春晖**
*出版社*:电子工业出版社
*语言*:简体中文
进阶类型 Go 语言书籍,涵盖高阶主题如 CGO、反射、网络等内容。:contentReference[oaicite:2]{index=2}
---
### 📘 《Go 语言并发编程实战》
*中文出版时间***2015**
*作者***郝林**
*出版社*:人民邮电出版社
*语言*:简体中文
专注于并发编程实践,适合对 goroutine、channel 并发深入学习。:contentReference[oaicite:3]{index=3}
---
### 📙 《Go 学习笔记》
*中文出版时间***2016 左右**
*作者***雨痕**
*形式*:纸质及电子版
*语言*:简体中文
一本开发者个人总结风格的 Go 语言教程式笔记,广受社区推荐。:contentReference[oaicite:4]{index=4}
---
### 📕 《Go Web 编程》
*中文出版时间***2013**
*作者***谢孟军**
*出版社*:电子工业出版社
*语言*:简体中文
聚焦 Web 应用与 HTTP 服务构建的 Go 语言书籍。:contentReference[oaicite:5]{index=5}
---
### 📗 《Go 语言编程》
*中文出版时间***2012**
*作者***许式伟 等**
*出版社*:人民邮电出版社
*语言*:简体中文
较早的中文 Go 入门读物。:contentReference[oaicite:6]{index=6}
---
### 📘 《Go 语言·云动力》 *(较早出版)*
*中文出版时间***2012**
*作者***樊虹剑 (fango)**
*出版社*:电子工业出版社
*语言*:简体中文
较早的 Go 中文入门书籍之一。:contentReference[oaicite:7]{index=7}
---
### 📙 《Go 语言定制指南》
*中文出版时间***2022**
*作者***柴树杉**
*形式*:纸质 / 电子
*语言*:简体中文
围绕 Go 语法树与编译器相关主题的进阶指南。:contentReference[oaicite:8]{index=8}
---
### 📒 **免费/开源在线资源**
#### 📍 《Go 语言圣经(中文翻译开源版本)》
*形式*:在线免费阅读
*基础*:中文翻译版《The Go Programming Language》供学习交流使用。:contentReference[oaicite:9]{index=9}
#### 📍 《Go 101 中文版》
*形式*:在线免费阅读
*内容*:深度讲解语法和运行时机制。:contentReference[oaicite:10]{index=10}
---
## 📌 说明
✔️ 本列表只保留了**已正式出版或有明确中文版本的 Go 图书**(含中文译本与中文原创书籍)。
✔️ 类似 *Learning Go*、*Head First Go*、*Black Hat Go* 等 **目前没有官方中文版**,因此本列表不包含它们。:contentReference[oaicite:11]{index=11}
---
## 贡献
如果你知道其他**正式出版的中文 Go 图书**(含 ISBN / 出版社),欢迎贡献补充内容!
## 许可证
<a rel="license" href="https://creativecommons.org/licenses/by/4.0/">
<img alt="Creative Commons License" style="border-width:0" src="https://i.creativecommons.org/l/by/4.0/88x31.png" />
</a><br />
本作品采用
<a rel="license" href="https://creativecommons.org/licenses/by/4.0/">
Creative Commons Attribution 4.0 International
</a> 授权。
[← 返回主列表](https://github.com/dariubs/GoBooks)
Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 188 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 228 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 263 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 371 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 178 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 376 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 309 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 293 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 415 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 368 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 394 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 381 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 428 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 225 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

+3
View File
@@ -0,0 +1,3 @@
module github.com/dariubs/gobooks/validator
go 1.21
+284
View File
@@ -0,0 +1,284 @@
// Validator for README.md structure in github.com/dariubs/gobooks.
//
// Checks: required sections, TOC link validity, no year prefixes in titles,
// book metadata (*Last published*, *Authors*), cover images exist, covers linked.
//
// Usage: go run . [path/to/README.md]
// go run . # uses README.md at repo root (../../README.md)
package main
import (
"fmt"
"os"
"path/filepath"
"regexp"
"strings"
)
func main() {
readmePath := filepath.Join("..", "..", "README.md")
if len(os.Args) > 1 {
readmePath = os.Args[1]
}
content, err := os.ReadFile(readmePath)
if err != nil {
fmt.Fprintf(os.Stderr, "Error reading file: %v\n", err)
os.Exit(1)
}
lines := strings.Split(string(content), "\n")
errors := []string{}
warnings := []string{}
// 1. Check main sections exist
requiredSections := []string{"Starter Books", "Advanced Books", "Web Development", "Resources"}
foundSections := extractSections(lines)
for _, sec := range requiredSections {
if !foundSections[sec] {
errors = append(errors, fmt.Sprintf("Missing required section: ## %s", sec))
}
}
// Contributing and License may use ## or ==== format
hasContributing := foundSections["Contributing"]
hasLicense := foundSections["License"]
for i, line := range lines {
if strings.TrimSpace(line) == "Contributing" && i+1 < len(lines) && strings.HasPrefix(lines[i+1], "====") {
hasContributing = true
}
if strings.TrimSpace(line) == "License" && i+1 < len(lines) && strings.HasPrefix(lines[i+1], "====") {
hasLicense = true
}
}
if !hasContributing {
errors = append(errors, "Missing required section: Contributing")
}
if !hasLicense {
errors = append(errors, "Missing required section: License")
}
// 2. Extract TOC links and section headers
tocLinks := extractTOCLinks(lines)
headers := extractHeaders(lines)
// Add Contributing/License anchors when using ==== format
if hasContributing {
headers["contributing"] = true
}
if hasLicense {
headers["license"] = true
}
// 3. Verify TOC links point to existing headers
for link, anchor := range tocLinks {
if !headers[anchor] {
errors = append(errors, fmt.Sprintf("TOC link points to non-existent anchor: [%s](#%s)", truncate(link, 50), anchor))
}
}
// 4. Check section headers have no year prefix (### 2020 - [Title] is wrong)
yearPrefix := regexp.MustCompile(`^###\s+\d{4}\s+-\s+`)
for i, line := range lines {
if yearPrefix.MatchString(line) {
errors = append(errors, fmt.Sprintf("Line %d: Book title should not have year prefix: %s", i+1, strings.TrimSpace(line)[:min(60, len(strings.TrimSpace(line)))]+"..."))
}
}
// 5. Check book entries have required metadata (*Last published* and *Authors*) - only in book sections
bookBlocks := extractBookBlocks(lines)
inResourceSection := false
for i, line := range lines {
if strings.TrimSpace(line) == "## Resources" {
inResourceSection = true
break
}
_ = i
}
resourceTitles := map[string]bool{"A tour of Go": true, "Video: Learn Go Syntax in one video": true, "Tutorials: Go by Example": true, "Go Fundamentals Video Training": true, "More Books on the Go Wiki": true, "TutorialEdge.net Course": true, "Coursera Specialization: Programming with Go": true, "Course: Understand Go's In-Depth Mechanics": true, "Course: Mastering Go Programming": true, "Course: Web Development with Google's Go Programming Language": true, "Golangbot.com Articles": true, "Tuxerrante repo on go exercises": true}
for title, block := range bookBlocks {
if resourceTitles[title] || inResourceSection && (strings.Contains(title, "tour") || strings.Contains(title, "Video") || strings.Contains(title, "Tutorial") || strings.Contains(title, "Course") || strings.Contains(title, "Articles") || strings.Contains(title, "Wiki")) {
continue
}
hasLastPublished := strings.Contains(block, "*Last published*")
hasAuthors := strings.Contains(block, "*Authors:*")
if !hasLastPublished {
warnings = append(warnings, fmt.Sprintf("Book '%s' missing *Last published*", truncate(title, 50)))
}
if !hasAuthors {
warnings = append(warnings, fmt.Sprintf("Book '%s' missing *Authors:*", truncate(title, 50)))
}
}
// 6. Check cover images exist
coverRefs := extractCoverRefs(lines)
for _, ref := range coverRefs {
if strings.HasPrefix(ref, "http") {
continue // external URL, skip
}
path := filepath.Join(filepath.Dir(readmePath), ref)
if _, err := os.Stat(path); os.IsNotExist(err) {
errors = append(errors, fmt.Sprintf("Cover image not found: %s", ref))
}
}
// 7. Check cover images are linked (wrapped in <a href>)
unlinkedCovers := findUnlinkedCovers(lines)
for _, img := range unlinkedCovers {
warnings = append(warnings, fmt.Sprintf("Cover image not linked to book: %s", img))
}
// Report
if len(errors) > 0 {
fmt.Println("❌ ERRORS:")
for _, e := range errors {
fmt.Println(" ", e)
}
}
if len(warnings) > 0 {
fmt.Println("\n⚠️ WARNINGS:")
for _, w := range warnings {
fmt.Println(" ", w)
}
}
if len(errors) > 0 {
os.Exit(1)
}
if len(warnings) > 0 {
fmt.Println("\n✓ Structure OK (with warnings)")
} else {
fmt.Println("\n✓ Structure OK")
}
}
func extractSections(lines []string) map[string]bool {
m := make(map[string]bool)
r := regexp.MustCompile(`^##\s+(.+)$`)
for _, line := range lines {
if match := r.FindStringSubmatch(line); match != nil {
m[strings.TrimSpace(match[1])] = true
}
}
return m
}
func extractHeaders(lines []string) map[string]bool {
m := make(map[string]bool)
r := regexp.MustCompile(`^#{1,6}\s+(.+)$`)
for _, line := range lines {
if match := r.FindStringSubmatch(line); match != nil {
text := strings.TrimSpace(match[1])
// Extract link text from [Title](url) or [Title](url) *Free*
linkMatch := regexp.MustCompile(`^\[([^\]]+)\][^\)]*\)`).FindStringSubmatch(text)
if linkMatch != nil {
text = linkMatch[1]
}
// Remove *Free* suffix
text = regexp.MustCompile(`\s*\*Free\*\s*$`).ReplaceAllString(text, "")
text = strings.TrimSpace(text)
anchor := toAnchor(text)
m[anchor] = true
// Add -free variant (TOC often uses this for free books even when header omits *Free*)
m[anchor+"-free"] = true
}
}
return m
}
func toAnchor(s string) string {
s = strings.ToLower(s)
s = regexp.MustCompile(`[^a-z0-9\s-]`).ReplaceAllString(s, "")
s = regexp.MustCompile(`\s+`).ReplaceAllString(s, "-")
return strings.Trim(s, "-")
}
func extractTOCLinks(lines []string) map[string]string {
m := make(map[string]string)
r := regexp.MustCompile(`^\s*-\s+\[([^\]]+)\]\(#([^\)]+)\)`)
for _, line := range lines {
if match := r.FindStringSubmatch(line); match != nil {
title := strings.TrimSpace(match[1])
anchor := strings.TrimSpace(match[2])
m[title] = anchor
}
}
return m
}
func extractBookBlocks(lines []string) map[string]string {
m := make(map[string]string)
bookR := regexp.MustCompile(`^###\s+\[([^\]]+)\].*$`)
var currentTitle string
var currentBlock strings.Builder
for _, line := range lines {
if match := bookR.FindStringSubmatch(line); match != nil {
if currentTitle != "" {
m[currentTitle] = currentBlock.String()
}
currentTitle = match[1]
currentBlock.Reset()
currentBlock.WriteString(line)
currentBlock.WriteString("\n")
} else if currentTitle != "" && (strings.HasPrefix(line, "###") || strings.HasPrefix(line, "##")) {
m[currentTitle] = currentBlock.String()
currentTitle = ""
currentBlock.Reset()
} else if currentTitle != "" && line != "-----" {
currentBlock.WriteString(line)
currentBlock.WriteString("\n")
}
}
if currentTitle != "" {
m[currentTitle] = currentBlock.String()
}
return m
}
func extractCoverRefs(lines []string) []string {
var refs []string
r := regexp.MustCompile(`src="(gobooks/covers/[^"]+)"`)
for _, line := range lines {
if match := r.FindStringSubmatch(line); match != nil {
refs = append(refs, match[1])
}
}
// Also check gobooks/cover/ path (typo)
r2 := regexp.MustCompile(`src="(gobooks/cover/[^"]+)"`)
for _, line := range lines {
if match := r2.FindStringSubmatch(line); match != nil {
refs = append(refs, match[1])
}
}
return refs
}
func findUnlinkedCovers(lines []string) []string {
var unlinked []string
r := regexp.MustCompile(`<img\s+src="(gobooks/covers/[^"]+)"`)
for _, line := range lines {
// Skip if img is inside <a href> or markdown link [<img...>](url)
if (strings.Contains(line, "<a href=") || strings.Contains(line, "](http")) && strings.Contains(line, "<img") {
continue
}
if match := r.FindStringSubmatch(line); match != nil {
unlinked = append(unlinked, match[1])
}
}
return unlinked
}
func truncate(s string, max int) string {
s = strings.Split(s, "(")[0]
s = strings.TrimSpace(s)
if len(s) > max {
return s[:max] + "..."
}
return s
}
func min(a, b int) int {
if a < b {
return a
}
return b
}