Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
115a0993bf | ||
|
|
14da22fb8f | ||
|
|
a3ea76157f | ||
|
|
4a7c312756 |
@@ -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'
|
||||||
@@ -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
|
|
||||||
@@ -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)
|
|
||||||
```
|
|
||||||
|
|||||||
@@ -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
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
.PHONY: validate
|
|
||||||
validate:
|
|
||||||
cd validator && go run . ../../README.md
|
|
||||||
@@ -1,78 +0,0 @@
|
|||||||
# Go-Bücher (Deutsch)
|
|
||||||
|
|
||||||
[](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)
|
|
||||||
@@ -1,63 +0,0 @@
|
|||||||
# Libros de Go (en español)
|
|
||||||
|
|
||||||
[](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)
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
<div dir="rtl">
|
|
||||||
|
|
||||||
# کتابهای Go (فارسی)
|
|
||||||
|
|
||||||
[](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>
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
# Livros de Go (em português)
|
|
||||||
|
|
||||||
[](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)
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
# Книги по Go (на русском)
|
|
||||||
|
|
||||||
[](https://github.com/dariubs/GoBooks)
|
|
||||||
|
|
||||||
Это список книг по Go, которые **официально изданы на русском языке**.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 📗 **Язык программирования Go**
|
|
||||||
|
|
||||||
*Последнее издание*: **2018 (русское издание)**
|
|
||||||
*Авторы*: **Alan A. A. Donovan** и **Brian W. Kernighan**
|
|
||||||
*Доступно в форматах*: **печать**, **электронная книга**
|
|
||||||
*Язык*: **русский**
|
|
||||||
|
|
||||||
Русский перевод классического авторитетного руководства по Go — одной из лучших книг по языку вообще. Подходит как для новичков, так и для тех, кто хочет глубокого понимания языка. (Источник: магазины книг на русском)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 📘 **Go: расширенное руководство (Го: Полное руководство)**
|
|
||||||
|
|
||||||
*Последнее издание*: **2021**
|
|
||||||
*Автор*: **Антон Поляк** (русский автор)
|
|
||||||
*Доступно как*: **печать**, **электронная книга**
|
|
||||||
*Язык*: **русский**
|
|
||||||
|
|
||||||
Книга от российского автора с практическими примерами, построенная как полноценное руководство по Go — от основ до продвинутых тем.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 📙 **Go. Современное программирование**
|
|
||||||
|
|
||||||
*Последнее издание*: **2019**
|
|
||||||
*Автор*: **Максим Петренко** (русский автор)
|
|
||||||
*Доступно как*: **печать**, **электронная книга**
|
|
||||||
*Язык*: **русский**
|
|
||||||
|
|
||||||
Ещё одно руководство по 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)
|
|
||||||
@@ -1,133 +0,0 @@
|
|||||||
# Go 书籍(中文)
|
|
||||||
|
|
||||||
[](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)
|
|
||||||
|
Before Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 81 KiB |
|
Before Width: | Height: | Size: 99 KiB |
|
Before Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 188 KiB |
|
Before Width: | Height: | Size: 143 KiB |
|
Before Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 228 KiB |
|
Before Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 7.7 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 56 KiB |
|
Before Width: | Height: | Size: 1.3 MiB |
|
Before Width: | Height: | Size: 66 KiB |
|
Before Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 78 KiB |
|
Before Width: | Height: | Size: 154 KiB |
|
Before Width: | Height: | Size: 85 KiB |
|
Before Width: | Height: | Size: 91 KiB |
|
Before Width: | Height: | Size: 86 KiB |
|
Before Width: | Height: | Size: 39 KiB |
|
Before Width: | Height: | Size: 39 KiB |
|
Before Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 118 KiB |
|
Before Width: | Height: | Size: 263 KiB |
|
Before Width: | Height: | Size: 37 KiB |
|
Before Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 106 KiB |
|
Before Width: | Height: | Size: 39 KiB |
|
Before Width: | Height: | Size: 63 KiB |
|
Before Width: | Height: | Size: 371 KiB |
|
Before Width: | Height: | Size: 116 KiB |
|
Before Width: | Height: | Size: 113 KiB |
|
Before Width: | Height: | Size: 35 KiB |
|
Before Width: | Height: | Size: 92 KiB |
|
Before Width: | Height: | Size: 37 KiB |
|
Before Width: | Height: | Size: 1.3 MiB |
|
Before Width: | Height: | Size: 55 KiB |
|
Before Width: | Height: | Size: 139 KiB |
|
Before Width: | Height: | Size: 136 KiB |
|
Before Width: | Height: | Size: 178 KiB |
|
Before Width: | Height: | Size: 376 KiB |
|
Before Width: | Height: | Size: 309 KiB |
|
Before Width: | Height: | Size: 293 KiB |
|
Before Width: | Height: | Size: 415 KiB |
|
Before Width: | Height: | Size: 43 KiB |
|
Before Width: | Height: | Size: 368 KiB |
|
Before Width: | Height: | Size: 47 KiB |
|
Before Width: | Height: | Size: 50 KiB |
|
Before Width: | Height: | Size: 56 KiB |
|
Before Width: | Height: | Size: 394 KiB |
|
Before Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 82 KiB |
|
Before Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 73 KiB |
|
Before Width: | Height: | Size: 89 KiB |
|
Before Width: | Height: | Size: 1.4 MiB |
|
Before Width: | Height: | Size: 381 KiB |
|
Before Width: | Height: | Size: 428 KiB |
|
Before Width: | Height: | Size: 5.6 KiB |
|
Before Width: | Height: | Size: 136 KiB |
|
Before Width: | Height: | Size: 225 KiB |
|
Before Width: | Height: | Size: 45 KiB |
|
Before Width: | Height: | Size: 12 KiB |
@@ -1,3 +0,0 @@
|
|||||||
module github.com/dariubs/gobooks/validator
|
|
||||||
|
|
||||||
go 1.21
|
|
||||||
@@ -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
|
|
||||||
}
|
|
||||||