Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
65b77dc103 | ||
|
|
b29194fb30 | ||
|
|
eac444c386 | ||
|
|
2997e056e5 | ||
|
|
14d057ae7b | ||
|
|
cfb82c17a1 | ||
|
|
c92ebe167d | ||
|
|
60cf0b8ccf | ||
|
|
4360f8fa4a | ||
|
|
158028eeba | ||
|
|
b5710293d4 | ||
|
|
2ab1ffbcaa | ||
|
|
b41391c9f9 | ||
|
|
4db0a75644 | ||
|
|
3a276e59f8 | ||
|
|
6d850f794f | ||
|
|
54f4a2b90d | ||
|
|
9da6c4589c | ||
|
|
da9645dff2 | ||
|
|
94b721283d | ||
|
|
aea5794085 | ||
|
|
d2666e42af | ||
|
|
d0efda0d3f | ||
|
|
6c05409e21 | ||
|
|
6044925c0e | ||
|
|
1f8fa1a7ca | ||
|
|
ae896f2278 | ||
|
|
04113c51e6 | ||
|
|
1690e6b1e3 | ||
|
|
63b9e87703 | ||
|
|
1bf3d2be72 | ||
|
|
5e596b17fe | ||
|
|
cc5951f33f | ||
|
|
4e86eab1f7 | ||
|
|
f8fd6943bc | ||
|
|
461fe1235b | ||
|
|
9eaac32ead | ||
|
|
677f5fcd3d | ||
|
|
36392bed38 | ||
|
|
00946f3322 | ||
|
|
16817fcc85 | ||
|
|
a17bd166c3 | ||
|
|
9c0798c520 | ||
|
|
f6c4e7158d | ||
|
|
9457b93969 |
@@ -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
|
||||
@@ -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 +0,0 @@
|
||||
ab*.json
|
||||
@@ -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)
|
||||
```
|
||||
|
||||
@@ -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
|
||||
@@ -0,0 +1,3 @@
|
||||
.PHONY: validate
|
||||
validate:
|
||||
cd validator && go run . ../../README.md
|
||||
@@ -0,0 +1,78 @@
|
||||
# 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)
|
||||
@@ -0,0 +1,63 @@
|
||||
# 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)
|
||||
@@ -0,0 +1,38 @@
|
||||
<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>
|
||||
@@ -0,0 +1,61 @@
|
||||
# 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)
|
||||
@@ -0,0 +1,65 @@
|
||||
# Книги по 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)
|
||||
@@ -0,0 +1,133 @@
|
||||
# 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)
|
||||
|
After Width: | Height: | Size: 34 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 81 KiB |
|
After Width: | Height: | Size: 99 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 188 KiB |
|
After Width: | Height: | Size: 143 KiB |
|
After Width: | Height: | Size: 34 KiB |
|
After Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 228 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 7.7 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 56 KiB |
|
After Width: | Height: | Size: 1.3 MiB |
|
After Width: | Height: | Size: 66 KiB |
|
After Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 78 KiB |
|
After Width: | Height: | Size: 154 KiB |
|
After Width: | Height: | Size: 85 KiB |
|
After Width: | Height: | Size: 91 KiB |
|
After Width: | Height: | Size: 86 KiB |
|
After Width: | Height: | Size: 39 KiB |
|
After Width: | Height: | Size: 39 KiB |
|
After Width: | Height: | Size: 42 KiB |
|
After Width: | Height: | Size: 118 KiB |
|
After Width: | Height: | Size: 263 KiB |
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 31 KiB |
|
After Width: | Height: | Size: 106 KiB |
|
After Width: | Height: | Size: 39 KiB |
|
After Width: | Height: | Size: 63 KiB |
|
After Width: | Height: | Size: 371 KiB |
|
After Width: | Height: | Size: 116 KiB |
|
After Width: | Height: | Size: 113 KiB |
|
After Width: | Height: | Size: 35 KiB |
|
After Width: | Height: | Size: 92 KiB |
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 1.3 MiB |
|
After Width: | Height: | Size: 55 KiB |
|
After Width: | Height: | Size: 139 KiB |
|
After Width: | Height: | Size: 136 KiB |
|
After Width: | Height: | Size: 178 KiB |
|
After Width: | Height: | Size: 376 KiB |
|
After Width: | Height: | Size: 309 KiB |
|
After Width: | Height: | Size: 293 KiB |
|
After Width: | Height: | Size: 415 KiB |
|
After Width: | Height: | Size: 43 KiB |
|
After Width: | Height: | Size: 368 KiB |
|
After Width: | Height: | Size: 47 KiB |
|
After Width: | Height: | Size: 50 KiB |
|
After Width: | Height: | Size: 56 KiB |
|
After Width: | Height: | Size: 394 KiB |
|
After Width: | Height: | Size: 29 KiB |
|
After Width: | Height: | Size: 82 KiB |
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 73 KiB |
|
After Width: | Height: | Size: 89 KiB |
|
After Width: | Height: | Size: 1.4 MiB |
|
After Width: | Height: | Size: 381 KiB |
|
After Width: | Height: | Size: 428 KiB |
|
After Width: | Height: | Size: 5.6 KiB |
|
After Width: | Height: | Size: 136 KiB |
|
After Width: | Height: | Size: 225 KiB |
|
After Width: | Height: | Size: 45 KiB |
|
After Width: | Height: | Size: 12 KiB |
@@ -0,0 +1,3 @@
|
||||
module github.com/dariubs/gobooks/validator
|
||||
|
||||
go 1.21
|
||||
@@ -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
|
||||
}
|
||||