4 Commits
Author SHA1 Message Date
Nathan Youngman 115a0993bf Adjust GitHub Actions trigger 2023-09-02 18:00:45 -06:00
Nathan Youngman 14da22fb8f trigger 2023-09-02 17:57:57 -06:00
Nathan Youngman a3ea76157f Udemy reports 403
https://github.com/lycheeverse/lychee/issues/1157
2023-09-02 17:42:30 -06:00
Nathan Youngman 4a7c312756 Switch Link Checker to Lychee
It’s fast and can handle more links
2023-09-02 17:35:36 -06:00
80 changed files with 352 additions and 1659 deletions
+18
View File
@@ -0,0 +1,18 @@
name: Links
on:
push:
branches: master
pull_request:
branches: master
jobs:
linkChecker:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Link Checker
uses: lycheeverse/lychee-action@v1
with:
fail: true
args: --accept 403 './**/*.md'
-21
View File
@@ -1,21 +0,0 @@
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
+2 -22
View File
@@ -1,38 +1,18 @@
Contribution Guidelines Contribution Guidelines
==== ====
## Adding a book to the main list
Add books with this format : Add books with this format :
``` ```
### DATE - [BOOK NAME](BOOK URL) ### DATE - [BOOK NAME](BOOK URL)
<img src="gobooks/covers/COVER_FILENAME" width="120px"/> <img src="BOOK COVER IMAGE ADDRESS" width="120px"/>
BOOK DESCRIPTION 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. * 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. * 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) * 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)
```
+328 -796
View File
File diff suppressed because it is too large Load Diff
-23
View File
@@ -1,23 +0,0 @@
# 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
@@ -1,3 +0,0 @@
.PHONY: validate
validate:
cd validator && go run . ../../README.md
-78
View File
@@ -1,78 +0,0 @@
# 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
@@ -1,63 +0,0 @@
# 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
@@ -1,38 +0,0 @@
<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
@@ -1,61 +0,0 @@
# 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
@@ -1,43 +0,0 @@
# Книги по 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
@@ -1,133 +0,0 @@
# 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.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 188 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 143 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 228 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 263 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 371 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 113 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 178 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 376 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 309 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 293 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 415 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 368 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 394 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 381 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 428 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 225 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

-3
View File
@@ -1,3 +0,0 @@
module github.com/dariubs/gobooks/validator
go 1.21
-284
View File
@@ -1,284 +0,0 @@
// 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
}