Monthly Review — Month 1: Go Fundamentals¶
🎬 Headline¶
I can read and write idiomatic Go end-to-end — from syntax and composite types through methods, interfaces, the error toolkit, and generics — and I shipped a tested, dependency-free CLI (taskcli) as proof.
🛠️ Skills Acquired¶
| Skill | Confidence (1-5) | Evidence (link) |
|---|---|---|
Syntax, variables, constants, iota |
4 | Day 002 |
| Control flow & functions (multi-return, defer, closures) | 4 | Week 1 review |
| Composite types: slices (aliasing/append), maps, sets | 4 | examples/.../slice-internals |
| Strings, runes & UTF-8 | 4 | examples/.../strings-runes |
| Structs, tags & JSON (un)marshaling | 4 | Day 025 |
| Methods & value/pointer receivers | 4 | examples/.../methods |
| Interfaces, implicit satisfaction, type switches | 4 | examples/.../interfaces |
Errors: %w wrapping, Is/As/Join, panic/recover |
4 | Week 3 review |
| Embedding & composition | 3 | Day 022 |
| Generics: type params, constraints, generic containers | 3 | examples/.../generics |
Table-driven testing (testing, t.TempDir, subtests) |
4 | Day 027 |
CLI building with stdlib flag |
3 | examples/.../cli-flags |
📦 Projects Completed¶
-
taskcli— a stdlib-only task manager:Taskmodel, atomic JSON file store,flag-based subcommands (add/list/done/rm), and table-driven tests — repo path · key learning: keepmainthin overrun() error, treat a missing data file as empty, and save atomically with temp-file +os.Rename.
💡 Lessons Learned¶
- Go optimizes for reading code: explicit errors, small interfaces, no inheritance, gofmt-enforced style. Boring is a feature.
- Zero values and "make the zero value useful" shape API design (nil-safe reads, no constructors needed for simple types).
- The big footguns are concrete and learnable: slice append aliasing, the nil-interface trap, nil-map writes, and
==vserrors.Ison wrapped errors. - Composition over inheritance plus implicit interfaces keep coupling low; generics remove
interface{}boxing where the algorithm is type-agnostic. - Testing is cheap and idiomatic in Go: table-driven subtests +
t.TempDir()make even file I/O easy to cover.
📉 Areas for Improvement¶
- Faster constraint selection (
comparablevscmp.Ordered) and remembering~for named types. - Spotting the nil-interface trap under time pressure.
- Haven't touched concurrency yet — the whole point of Month 2.
🔁 Concepts to Keep Reviewing (carry into spaced repetition)¶
- Slice backing-array aliasing & three-index slicing.
- Method sets of
Tvs*Tand how embedding promotes them. errors.Is/As/Joinreflexes over==/string compares.- Generics vs interfaces decision; union constraints with
~.
🧑💼 Interview Readiness¶
| Area | Ready? | Notes |
|---|---|---|
| Language fundamentals | ✅ | Confident on types, methods, interfaces, errors, generics; can whiteboard slice/map internals. |
| Concurrency | ⬜ | Not started — Month 2 focus (goroutines, channels, select, context). |
| Web/DB | ⬜ | Built a CLI + JSON files; no HTTP server or SQL yet (later months). |
🎒 Portfolio Updates¶
- Updated project README + usage examples for
taskcli - New résumé bullet: "Built a tested, zero-dependency Go CLI (atomic JSON storage, stdlib
flagsubcommands, table-driven tests)." - Pinned/featured:
go-from-zerolearning journal (28 daily notes, examples, exercises) - Tagged release
v0.1.0+ wrote release notes
📊 Metrics¶
| Total hours | Days completed | Exercises | Projects | Books/articles | Avg confidence |
|---|---|---|---|---|---|
| 38 | 28/28 | 12 | 1 | 6 | 3.8/5 |
⏭️ Next Month Preview¶
Month 2 is Concurrency & the runtime: goroutines, channels and their axioms, select, the sync package, context for cancellation/deadlines, and the race detector. Prep: re-read the channel/goroutine chapters before Day 029 and keep the run() error + table-driven (-race) testing habits from this month.
Suggested commit: docs(journal): month 1 review then git tag -a v0.1.0 -m "Month 1 complete"