Limba Go este o nouă limbă interesantă care câștigă multă popularitate pentru un motiv bun. În acest tutorial veți învăța cum să scrieți programe de linie de comandă cu Go. Programa eșantion se numește multi-git și vă permite să executați comenzi git pe mai multe depozite în același timp.
Go este un limbaj de tip open-source C creat la Google de unii dintre hackerii originali C și Unix, care au fost motivați de disprețul lor față de C ++. Se arată în designul Go, care a făcut mai multe opțiuni neortodoxe, cum ar fi evitarea moștenirii implementării, șabloanelor și excepțiilor. Go este simplu, fiabil și eficient. Caracteristica sa cea mai distinctă este sprijinul explicit pentru programarea concurentă prin așa-numitele gorutine și canale.
Înainte de a începe să disecați programul de probă, urmați ghidul oficial pentru a vă pregăti pentru dezvoltarea Go.
Go este un limbaj de programare incredibil de puternic, învățați totul, de la scrierea de utilități simple la construirea de servere web scalabile și flexibile în întregime.
Programul multi-git este un program simplu, dar util Go. Dacă lucrați într-o echipă în care codul de bază este împărțit în mai multe depozite de git, atunci este necesar să efectuați modificări în mai multe depozite. Aceasta este o problemă deoarece GIT nu are conceptul de depozite multiple. Totul se învârte în jurul unui singur depozit.
Acest lucru devine deosebit de dificil dacă utilizați sucursale. Dacă lucrați la o caracteristică care atinge trei depozite, atunci va trebui să creați o ramură de caracteristici în fiecare dintre aceste depozite și apoi să vă amintiți să verificați, să trageți, să împingeți și să le îmbinați simultan. Acest lucru nu este banal. Multi-git gestionează un set de depozite și vă permite să operezi pe întreg setul dintr-o dată. Rețineți că versiunea curentă a multi-git necesită crearea individuală a sucursalelor, dar pot adăuga această caracteristică la o dată ulterioară.
Prin explorarea modului în care este implementat multi-git, veți învăța multe despre scrierea programelor de linie de comandă în Go.
Programele Go sunt organizate în pachete. Programul multi-git constă dintr-un singur fișier numit main.go. În partea de sus a fișierului, numele pachetului "principal" este specificat, urmat de o listă de importuri. Importurile sunt alte pachete care sunt utilizate de multi-git.
importul principal al pachetului ("flag" "fmt" "log" "os" "șiruri" "os / exec")
De exemplu, pachetul fmt este utilizat pentru I / O formatate similar cu printf și scanf C. Go acceptă instalarea pachetelor dintr - o varietate de surse prin du-te și ia
comanda. Când instalați pachetele, acestea se termină într-un spațiu de nume sub $ GOPATH variabilă de mediu. Puteți instala pachete dintr-o varietate de surse, cum ar fi GitHub, Bitbucket, cod Google, Launchpad și chiar servicii IBM DevOps prin intermediul mai multor formate comune de control al versiunilor, cum ar fi git, subversiune, mercurial și bazar.
Argumentele de la linia de comandă reprezintă una dintre formele cele mai comune de furnizare a datelor pentru programe. Ele sunt ușor de utilizat, vă permit să rulați și să configurați programul într-o singură linie și să aveți un suport de parsing excelent în multe limbi. Go le numește linia de comandă "flags" și are pachetul de pavilion pentru specificarea și parsarea argumentelor liniei de comandă (sau a semnelor).
De obicei, analizați argumentele liniei de comandă la începutul programului dvs., iar multi-git urmează această convenție. Punctul de intrare este principal()
funcţie. Primele două linii definesc două pavilioane numite "comanda" și "ignoreErrors". Fiecare steag are un nume, un tip de date, o valoare implicită și un șir de ajutor. flag.Parse ()
apel va analiza linia de comandă reală trecută la program și va popula drapelele definite.
func (): comanda: = flag.String ("comanda", "", comanda git ") ignoreErrors: = flag.bool (" ignore-errors " .Analiza()
Este, de asemenea, posibil să accesați argumente nedefinite prin flag.Args ()
funcţie. Deci, steagurile reprezintă argumente predefinite, iar argumentele sunt argumente neprocesate. Argumentele neprocesate sunt indexate pe bază de 0.
O altă formă comună de configurare a programului este variabilele de mediu. Când utilizați variabile de mediu, puteți executa același program de mai multe ori în același mediu și toate run-urile vor utiliza aceleași variabile de mediu.
Multi-git utilizează două variabile de mediu: "MG_ROOT" și "MG_REPOS". Multi-git este conceput pentru a gestiona un grup de depozite git care au un director parental comun. Aceasta este "MG_ROOT". Numele repository sunt specificate în "MG_REPOS" ca șir separat prin virgulă. Pentru a citi valoarea unei variabile de mediu, puteți utiliza funcția os.Getenv ()
funcţie.
// Obțineți repo gestionate din variabilele de mediu rădăcină: = os.Getenv ("MG_ROOT") dacă root [len (root) - 1]! = '/' Repo_names: = strings.Split .Getenv ("MG_REPOS"), ",")
Acum că a găsit directorul rădăcină și numele tuturor depozitelor, multi-git verifică că fiecare depozit există sub rădăcină și că este într-adevăr un depozit git. Verificarea este la fel de simplă ca și căutarea unui sub-director .git pentru fiecare director de depozitare.
Mai întâi, este definită o serie de șiruri numite "repos". Apoi repetă toate numele repo și construiește o cale de depozitare prin concatenarea directorului rădăcină și a denumirii repo. În cazul în care [Os.Stat ()] ()
apelul nu reușește pentru subdirectorul .git, înregistrează eroarea și iese. În caz contrar, calea repository este atașată la matricea repos.
var repos [] șir // Verificați că toate repo-urile există și sunt de fapt git repos (au .git sub-dir) pentru _, r: = interval repo_names path: = root + r _, err: "/.git") dacă err! = nil log.Fatal (err) repos = atașați (repos, cale)
Go are o facilitate unică de tratare a erorilor, în care funcțiile întorc adesea atât valoarea returnată, cât și obiectul de eroare. Verificați cum os.Stat ()
returnează două valori. În acest caz, substituentul "_" este utilizat pentru a menține rezultatul real pentru că vă pasă doar de eroare. Deplasarea este foarte strictă și necesită utilizarea unor variabile numite. Dacă nu intenționați să utilizați o valoare, trebuie să o atribuiți "_" pentru a evita erorile de compilare.
În acest moment, aveți lista cu căile de depozitare unde vrem să executăm comanda git. După cum vă amintiți, am primit linia de comandă git ca un singur argument (flag) numit "comandă". Aceasta trebuie împărțită într-o serie de componente (comanda git, subcomandă și opțiuni). Întreaga comandă ca și șir este stocată și în scopuri de afișare.
// Întrerupeți comanda git în componente (necesare pentru a executa) var git_components [] șir pentru _, component: = interval strings.Split (* comanda, "") git_components = append (git_components, component) "+ * comanda
Acum, sunteți pregătit să repetați fiecare depozit și să executați comanda git în fiecare dintre acestea. Construcția buclă "pentru ... gamă" este din nou utilizată. Mai întâi, multi-git își schimbă directorul de lucru la replica țintă curentă și imprimă comanda git. Apoi execută comanda folosind exec.Command ()
funcția și imprimă ieșirea combinată (atât ieșire standard cât și eroare standard).
În cele din urmă, verifică dacă a apărut o eroare în timpul executării. Dacă a apărut o eroare și ignoreErrors
steagul este fals, atunci multi-git bails afară. Motivul pentru ignorarea opțională a erorilor este că uneori este OK dacă comenzile eșuează pe unele repo-uri. De exemplu, dacă doriți să verificați o sucursală denumită "caracteristică răcoritoare" în toate depozitele care dețin această ramură, nu vă pasă dacă plata nu reușește în depozitele care nu au această ramură.
pentru _, r: = repos range // Mergeți în directorul repo os.Chdir (r); // Imprimați comanda fmt.Printf ("[% s]% s \ n", r, command_string) // Executați comanda out, err: = exec.Command ("git", git_components ...) .CombinedOutput / Imprimați rezultatul fmt.Println (șirul (out)) // salvare dacă a existat o eroare și NU ignoră erorile dacă err! = Nil &&! * IgnoreErrors os.Exit (1) fmt.Println . ")
Go este un limbaj simplu dar puternic. Este proiectat pentru programarea pe scară largă a sistemului, dar funcționează foarte bine și pentru programele mici de linie de comandă. Go designul minimal este în contrast puternic cu alte limbi moderne cum ar fi Scale și Rust, care sunt foarte puternice și bine concepute, dar au o curbă foarte abruptă de învățare. Vă încurajez să încercați să mergeți și să experimentați. Este foarte distractiv.