tracks / go-to-python
Go
Python

A guided path for Go developers who want to think clearly in Python.

Trade compile-time rigidity for lighter, faster-moving Python code.

This track is built for Go developers moving into Python for application work, automation, or services. It focuses on readability-first design, lighter syntax and structure, flexible data modeling, exceptions instead of returned errors, pytest ergonomics, and Python's different concurrency story.

6 lessons~2.5 hrscomparison-firststatus: stableupdated Apr 2026

before you start

  • $You already write real Go code. This path assumes professional instincts, not beginner-level programming lessons.
  • $Expect comparison-first modules: each stop starts from familiar Go habits, then shows where Python agrees or pushes back.
  • $Plan to practice the target ecosystem directly — syntax, testing, and design choices should feel native by the end, not translated.

by the end you can

  • Read and write idiomatic Python without translating every line back through Go.
  • Spot which Go instincts transfer cleanly and which ones need a different Python mental model.
  • Use the six modules as a working checklist when you build your first real Python tool, service, or feature.

syllabus

6 modules, one capstone.

6 lessons · ~2.5 hrs
module 01
1 lesson · ~25 min

Mindset shift

Move from Go's explicit, compiled style toward Python's readability-first and faster iteration model.

module 02
1 lesson · ~25 min

Syntax and structure

Map Go packages, functions, and control flow onto Python modules, functions, and indentation-driven structure.

module 03
1 lesson · ~25 min

Data and state modeling

Learn when Python wants a list, dict, class, or dataclass rather than a translated Go struct-heavy model.

module 04
1 lesson · ~25 min

Error handling

Translate from returned error values into Python's exception style without making the control flow noisy.

module 05
1 lesson · ~25 min

Testing in Python

Map Go's standard-library testing habits onto pytest's direct assertions, fixtures, and faster iteration style.

module 06
1 lesson · ~25 min

Async I/O and concurrency

Learn Python's async I/O model and concurrency tradeoffs without assuming goroutines and channels transfer directly.

track reference

Keep the shared translation aids in one place.

These are track-wide lookup tables and task patterns, not lesson-specific reading. Use them when you need a quick reset on the recurring source-to-target language translations.

Data type mappings

Recheck the building blocks when a translation starts to wobble.

Go

string

Python

string

Common operations

  • Move from fmt-based formatting to f-strings.
  • String work becomes lighter and more direct in Python.
  • Keep readability first instead of preserving Go ceremony.

Go

slice

Python

list

Common operations

  • Append with append(...) in Go and list.append(...) in Python.
  • Many explicit loops can become comprehensions in Python when they stay readable.
  • Lists are more flexible than Go slices but less explicit about capacity semantics.

Go

struct / map

Python

dataclass or dict

Common operations

  • Choose dicts or dataclasses based on how much structure the code needs.
  • Use dataclasses when the shape is stable and worth naming.
  • Keep Python models lighter than direct Go struct ports when that improves readability.

Go

error / nil

Python

exception / None

Common operations

  • Use exceptions instead of returned error values for failure.
  • Use None for ordinary absence rather than zero values or nil patterns.
  • Keep failure and absence distinct even though Python expresses them differently.

Comparative cheat sheet

Keep the most common tasks visible while you practice.

TaskGoPython
Define a functionfunc greet(name string) string { return "hello " + name }def greet(name: str) -> str: return f"hello {name}"
Format a stringmsg := fmt.Sprintf("user=%d", id)msg = f"user={user_id}"
Add to a collectionitems = append(items, value)items.append(value)
Handle failing dataif err != nil { return err }try: load_user(user_id) except UserError as error: raise
Test a functionfunc TestSlugify(t *testing.T) { ... }def test_slugify(): assert slugify("Hello") == "hello"

capstone

Ship a small Python project that proves the mental model stuck.

Build one focused artifact in Python using the same comparison-first habits from the track: start from a familiar Go shape, then deliberately redesign it the way Python expects.

  • Translate a familiar Go data flow into idiomatic Python structure instead of preserving the old shape by force.
  • Apply the early modules to data modeling, control flow, and API boundaries before you add tooling, polish, or deployment concerns.
  • Use the later modules to verify, test, and package the result the way Python developers expect to see it shipped.

ready?

Start with module 01 — Mindset shift.

Begin