Go is een open source programmeertaal ontwikkeld door Google en ontworpen om te helpen bij het bouwen van eenvoudige, betrouwbare softwaresystemen. De kernkracht van Go is de gelijktijdigheidsmechanismen die het eenvoudiger maken om software te schrijven, om multi-core architecturen te gebruiken.
Het is een gecompileerde, sterk statisch getypeerde, gelijktijdige en vuilnisgezinde taal.
Het is een zeer interessante, moderne dagtaal vanwege een aantal van de keuzes die zijn gemaakt tijdens het ontwerp. Bijvoorbeeld, het Type Systeem, hoewel Go methoden heeft en ook een OO-stijl van programmeren, is er geen typehiërarchie. De enige manier om dat te bereiken is via interfaces.
Men moet de taalspecificatie lezen om een beter begrip te krijgen van de ontwerpelementen van de taal. Het is echt beknopt en helpt een aantal echt interessante details naar voren brengen. De manier waarop Go verschilt van andere typische programmeertalen, is dat het functies heeft die anders zijn dan in andere OO-talen:
De Go-code wordt bewaard onder werkruimten. Het is gewoon een directoryhiërarchie, als volgt:
src
- bevat Go-bronbestanden als pakkettenpkg
- bevat pakketobjectenbak
- bevat uitvoerbare bestandenDe Go-tool bouwt de bronpakketten en installeert de resulterende binaries in bak
en pkg
directories.
Laten we een statische site bouwen en deze vervolgens verbeteren zodat deze zich veel dynamischer gedraagt, op basis van gebruikersinvoer.
De codestructuur voor de statische site ziet er als volgt uit:
Dus zou je in essentie een structuur willen maken die lijkt op de afbeelding hierboven of zoals wordt getoond in de repository. Deze repo-structuur zou zelf onder de werkruimte
. Lees meer over de Go-codestructuur voor meer informatie.
Wat we nu willen doen is een HTML-bestand serveren dat zich in de openbare map bevindt.
De index.html
inhoud is als volgt:
Statische site met behulp van Go Website ontwikkelen met Go
Ik ben een statische pagina en wordt u aangeboden met de hulp van Go lang.
En hier is het Go-programma om bestanden statisch te bedienen vanuit de openbare map:
pakket main import ("net / http") func main () fs: = http.FileServer (http.Dir ("public")) http.ListenAndServe (": 8080", fs)
Staat u mij toe om uit te leggen:
Dat is het. Echt eenvoudig en to the point. U kunt de code uitvoeren met behulp van het volgende: ga naar gostatic.go
.
Deze oplossing scheidt echter niet duidelijk de problemen met routing en serveren en daarom zou een betere oplossing zijn in de trant van:
pakket main import ("net / http" "log") func main () fs: = http.FileServer (http.Dir ("public")) http.Handle ("/", fs) log.Println ("Luisteren ... ") err: = http.ListenAndServe (": 8080 ", nil) if err! = Nil log.Fatal (" ListenAndServe: ", err)
ListenAndServe
start een HTTP-server op het opgegeven TCP-adres en belt vervolgens met een handler. Deze handler is meestal nul, zodat de standaard router (in Go's geval de DefaultServerMux kan overnemen).
Nu met betrekking tot DefaultServeMux - Laten we een korte omweg maken om te begrijpen hoe Go de HTTP-verwerking uitvoert. Het doet dit met behulp van twee primaire dingen.
Ga je gang en voer de voorbeeldwebapp uit zoals eerder gedaan en je zou de uitvoer moeten zien!
Laten we vervolgens de applicatie schrijven zodat deze de huidige tijd afdrukt, wat impliceert dat bij elke vernieuwing u een andere output krijgt. De Go-code zou er zo uitzien:
pakket main import ("fmt" "net / http" "time") func main () http.HandleFunc ("/", handler) log.Println ("listening ...") err: = http.ListenAndServe (": 8080 ", nul) if fout! = nihil paniek (err) func-handler (w http.ResponseWriter, r * http.Request) fmt.Fprintf (w," Hallo. De tijd is: "+ time.Now ( ) .Format (time.RFC850))
Hier hebben we geïmporteerd fmt
om met sommige afdrukfuncties te werken. De fmt implementeert geformatteerde I / O-functies in de trant van C's stdio
bibliotheek.
We hebben ook gebruik gemaakt van HandleFunc
die het URL-pad registreert met de handlerfunctie in de DefaultServeMux. De functiehandler is van het type http.HandlerFunc
. Het kost een http.ResponseWriter
en http.Request
als zijn argumenten. Mensen die bekend zijn met Java-servlets, herinneren zich dit te doen!
Om tijd af te drukken, importeren we 'tijd' uit het standaardpakket en gebruiken we deze om te reageren op het antwoordschrijfobject. Door te schrijven naar http.ResponseWriter
object kunnen we de reactie naar de klant sturen.
http.Request
is de structuur die het HTTP-verzoek vertegenwoordigt en heeft daarom de volledige aanvraaggegevens. Om toegang te krijgen tot het URL-pad dat we hebben r.URL.path
.
Wanneer u dit uitvoert en vervolgens toegang krijgt localhost: 8080
je zou de huidige tijd bij elke verversing moeten zien.
Laten we nu een applicatie schrijven die a accepteert gebruikersnaam
op de indexpagina en vervolgens wanneer het formulier wordt verzonden, wordt de gebruiker op de volgende pagina begroet.
Dit is onze Go-codestructuur:
Laten we eerst een HTML-bestand maken met het formulier in de openbare map.
Ga Greeter Ga Greeter
Dit formulier, op verzenden, wordt omgeleid naar /begroeten
. Laten we ook de inhoud van de greet.html
bestand in de openbare map, die we zouden renderen wanneer het verzoek komt /begroeten
.
Ga Greeter Hallo .
De Go-code is als volgt:
pakket main import ("log" "net / http" "html / template") func main () http.HandleFunc ("/", root) http.HandleFunc ("/ greet", greeter) log.Println ("Luisteren ... ") err: = http.ListenAndServe (": 8080 ", nihil) if err! = Nil log.Fatal (" ListenAndServe: ", err) func root (w http.ResponseWriter, r * http.Request) t, _: = template.ParseFiles ("public / index.html") t.Execute (w, nil) func greeter (w http.ResponseWriter, r * http.Request) username: = r.FormValue (" gebruikersnaam ") t, _: = template.ParseFiles (" public / greeter.html ") err: = t.Execute (w, gebruikersnaam) if err! = nil http.Error (w, err.Error (), http .StatusInternalServerError)
We hebben gebruikt html / template
om de HTML-code in sjablonen te bewaren en ze vervolgens op verzoek te gebruiken om te renderen.
Er is een nieuwsgierige blik .
in de greeter.html
het dossier. De html / template
pakket gaat ervan uit dat platte tekst altijd wordt geproduceerd. Het voegt waar nodig escaping toe om die eenvoudige reeks veilig in te bedden in de juiste context. Wanneer een gegevenswaarde geen platte tekst is, kunnen we ervoor zorgen dat deze niet wordt geëscaped door het type ervan op te geven. Dus in wezen, Hallo, .!
kan worden aangeroepen door te gebruiken tmpl.Execute (out, HTML ('Nishant'))
produceren Hallo, Nishant!
. Ga je gang, probeer dat eens!
Omdat de basistoepassing nu werkt, kunnen we deze eindelijk in Heroku implementeren.
Zodra u de Heroku-toolbelt correct opgezet en de repo beheerd via Git, kunnen we het op deze manier implementeren.
De enige verandering die we zouden moeten doen in de code voor implementatie in Heroku, is de lijn veranderen waar wij luister op een specifieke poort.
Verandering:
http.ListenAndServe (": 8080", ...)
naar:
http.ListenAndServe ( ":" + os.Getenv ( "PORT"), ...
.
Als u zich wilt inzetten voor Heroku, hebt u een Heroku-gebruikersaccount nodig. U hebt ook een opdrachtregelprogramma voor Heroku nodig. Haal het door de Heroku Toolbelt te installeren als dat nog niet het geval is.
Na installatie meldt u zich aan met behulp van het Heroku-account heroku login
, en upload vervolgens je SSH-sleutel. Met deze dingen op zijn plaats zou je klaar moeten zijn om je in te zetten voor Heroku.
Om te kunnen inzetten op Heroku, moeten we de app opslaan in Git.
git init. git add -A. git commit -m 'eerste heroku go-app'
We zullen ook een Procfile nodig hebben om Heroku te vertellen dat de opdracht die het moet uitvoeren voor het webproces onze app is.
echo 'web: gogreeter'> Procfile
Go-pakketafhankelijkheden worden beheerd op Heroku met behulp van Godep
pakketjes.
Installeer Godep en bewaar uw afhankelijkheden met behulp van het volgende:
ga github.com/kr/godep godep opslaan
Voeg deze nieuwe bestanden toe aan Git:
git add -A. git commit -m 'godep'
Maak tot slot de Heroku-applicatie. Het kan zo worden gedaan:
heroku create -b https://github.com/kr/heroku-buildpack-go.git
Dit zou een Git-afstandsbediening in je repository met de naam van moeten maken Heroku
. U bent nu klaar om te implementeren! Voer het volgende uit:
git push heroku master
Nadat de bovenstaande opdracht is voltooid, moet uw app actief zijn!
Ga naar de URL door te zeggen heroku open
of door de app-URL te bezoeken die u in de console ziet.
Dat is het. U hebt nu een Go-toepassing die actief is op Heroku!
In deze tutorial hebben we geleerd hoe eenvoudig het is om een Go-webtoepassing te ontwikkelen en deze ook op Heroku in te zetten. Tegenwoordig is webontwikkeling grotendeels afhankelijk van de kaders die men gebruikt. Om een aantal van deze opties te verkennen, moet u zeker een aantal van deze projecten bekijken.