Az én utam a Pythonból a Go-hoz – megosztom tanácsaimat és forrásaimat

Az én utam a Pythonból a Go-hoz – megosztom tanácsaimat és forrásaimat

A fordítótól: fordították az Ön számára Ilad Leev cikkét a Pythonról Go-ra való átállásról. A cikk nemcsak kezdő programozók számára lehet hasznos, hanem mindenkinek, aki érdeklődik a Go iránt.

Szeretem a Pythont. Ez a nyelv az utolsó öt évben a kedvencem volt. Barátságos, hatékony, és könnyen tanulható. Szinte mindenre használható: egyszerű szkriptek készítésétől és webfejlesztéstől kezdve az adatok vizualizációjáig és a gépi tanulásig.

A Go fokozatos „érlelése”, a széles közösség, valamint az a tény, hogy egyre több cég fogadja el ezt a nyelvet sikeres tesztek után, arra késztettek, hogy figyelmet fordítsak rá és elmélyedjek a irodalomban. De ez a bejegyzés nem arról szól, hogy mi a jobb – Python vagy Go: az interneten rengeteg összehasonlítás található. Véleményem szerint minden az alkalmazási területtől függ. El szeretném mondani, miért választottam a Go-t, adok néhány tanácsot és linket hasznos forrásokhoz mindenkinek, aki érdeklődik a téma iránt.

A Skillbox ajánlja: Gyakorlati kurzus Python fejlesztő kezdőknek.

Emlékeztetjük: minden «Habr» olvasónak 10 000 rubeles kedvezmény jár bármely Skillbox kurzus jelentkezésekor a «Habr» promóciós kód felhasználásával.

Az én utam a Pythonból a Go-hoz – megosztom tanácsaimat és forrásaimat

Megfigyelések

Az első dolog, amit az út kezdetén tettem, az volt, hogy megtanultam egy nagyszerű hivatalos útmutatót „Tour Of Go”. Ez megadja a nyelv szintaxisának megértését.

A tudásom fejlesztése érdekében olvastam egy másik könyvet is „Go for Python Programmers”, ami lehetővé tette, hogy átugorjam a következő szakaszra – kísérletezés és hibák.

Azokkal a megszokott funkciókkal próbálkoztam, amelyeket a Pythonban használtam (JSON sorosítás vagy HTTP hívások kezelése), és megpróbáltam megírni őket Go-ban. Az ilyen kézzelfogható összehasonlítás révén sikerült feltárnom a nyelvek közötti kulcsfontosságú eltéréseket.

A projekt felépítése

Elsősorban a Python nem igényel speciális mappastruktúrát, míg a Go igen.

A Go a „szabványos” felépítést használja, amely egy kicsit bonyolultabb és több munkát igényel. Másrészt az eredmény egy jól strukturált kód alap, ahol moduláris felépítés használatos, és a projekt bővítésekor a kód továbbra is szigorúan rendezett marad.

A hivatalos útmutató „How to Write Go Code” magyarázza, hogyan lehet megszervezni a munkáját.

Statikus szigorú típusszabályozás

A Go statikusan típusos, és ez idegennek érezheti magát azok számára, akik a dinamikusan típusos nyelvekhez, mint a Python és a Ruby, szoktak.

Nincs kétség afelől, hogy a dinamikus nyelvek hajlamosabbak a hibákra, a fejlesztőtől pedig több erőfeszítést igényel a bemeneti adatok ellenőrzése. Példa — egy olyan függvény, amely két egész szám összegét számolja. Ha egy karakterláncot adunk át a függvénynek (ami nem olyan ritka), az TypeError hibához vezet.

A Go-ban ilyesmi nem történhet meg, mivel itt minden változóhoz és függvényhez meg kell határozni a típust, valamint azt is, hogy a függvény milyen típust ad vissza.

Először zavaró volt: azt hittem, hogy a Go ezen jellemzője lassítja a munkát – de később rájöttem, hogy valójában mindennek a deklarálása időt takarít meg, és csökkenti a hibák valószínűségét.

Natív párhuzamosság

A Go natív párhuzamosságot biztosít szubprogramok és csatornák használatával — ez nagyon kényelmes.

A csatornák koncepciója elsőre kissé zavarosnak tűnik. Azonban idővel egyre világosabbá válik, és elkezded élvezni az új lehetőségeket, aktívan dolgozva velük.

Itt van az összes eddigit vizuálisan Ivan Daniljuk.

package main
 
func main() {
    // új csatorna létrehozása int típussal
    ch := make(chan int)
 
// új anonim goroutine indítása
    go func() {
        // 42 küldése a csatornára
        ch <- 42
    }()
    // olvasás a csatornából
    <-ch
}

Az én utam a Pythonból a Go-hoz – megosztom tanácsaimat és forrásaimat

További példák itt és itt.

A JSON kezelés

Nos, json.loads() már nincs. A Pythonban ez egyszerű: használjuk a json.loads-ot, és nincs probléma.

De a Go-ban, amely statikusan típusos nyelv, ez a művelet bonyolultabbá válik.

Itt a JSON használata során minden előre meghatározott. Bármilyen mező, amely nem illeszkedik a megadott struktúrába, figyelmen kívül marad, ami jó. Ezt előre megállapodott protokollként lehet értelmezni a két fél között. Az adatok, amelyeket JSON-ban kapsz, várhatók, és a JSON mezők és típusok "megállapodtak" mindkét fél által.

{
  "first": "Elad",
  "last": "Leev",
  "location": "IL",
  "id": "93"
}

type AccountData struct {
 First    string `json:"first"`
 Last     string `json:"last"`
 Location string `json:"location"`
 ID       string `json:"id"`
}

Természetesen JSON-t strukturák nélkül is deszerializálhatsz, de ezt a lehetőségekhez képest érdemes elkerülni, figyelembe véve a nyelv statikus természetét.

A JSON dekódolása a GO-ban a legjobban a következő bejegyzésben magyarázható el vagy itt.

Lusták vagytok konvertálni a JSON-ot Go struktúrába? Nincs probléma, ez az eszköz mindent megcsinál helyetted.

Tiszta kód

A Go compiler will always strive to keep your code 'clean.' It considers unused variables a compilation error. Go uses a unique approach that allows the system to solve most formatting issues. Thus, Go will run the gofmt program upon saving or compiling and will automatically correct the formatting.

Don't care about variables? Okay! Just use _ (underscore) and assign it to an empty identifier.

A must-read tutorial for this part of working with the language is information from “Effective Go”.

Searching for suitable libraries and frameworks

I used frameworks and libraries with Python like Flask, Jinja2, Requests, and even Kazoo, so I was worried I wouldn’t find anything suitable for Go.

But the community has already solved these issues: the language has its own unique libraries that allow you to completely forget about what you used before.

Here are my favorites.

Python Requests => net/http

net/http provides a convenient and easy-to-use implementation of an HTTP client and server.

Flask + Jinja2 => Gin

Gin is an HTTP web framework with a very simple API: path parameters, file uploads, group routing (/api/v1, /api/v2), custom log formats, serving static files, HTML rendering, and truly powerful custom middleware.
Check out az the benchmark.

CLI Creation => Cobra

Cobra is a library for creating powerful CLI applications, as well as a tool for generating applications and command files.
Cobra is used in many large Go projects, including Kubernetes, etcd, and OpenShift.

Here are a few more libraries that I highly recommend: Viper, Gonfig and this amazing list — Awesome-Go.

Other useful resources

[1] Francesc Campoy — you definitely need to check out these YouTube channels és GitHub profile.

[2] GopherCon — videos.

[3] Go Web Examples.

[4] Golang Weekly, Gopher Academy, Golang News — Twitter accounts.

Összegzés

Having been a regular Python user for five years, I was afraid that switching to Go would be painful.

But no: there are community practices in Go that enhance and extend the capabilities of the language, as well as various useful resources that will help you with the transition.

Go is rapidly evolving, and I hope that Google will make it the primary language for cloud applications and infrastructure.

Csatlakozzatok!

Az én utam a Pythonból a Go-hoz – megosztom tanácsaimat és forrásaimat

A Skillbox ajánlja:

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster