Go är ett open source-programmeringsspråk som utvecklats hos Google och utformat för att hjälpa till att bygga enkla pålitliga programvarusystem. Kärnstyrkan hos Go är dess samtidiga mekanismer som gör det enklare att skriva programvara, för att utnyttja multikärnarkitekturer.
Det är ett kompilerat, starkt - statiskt skrivet, samtidigt och soporuppsamlat språk.
Det är ett mycket intressant, modernt språk på grund av några av de val som har gjorts under designen. Till exempel, Typ-systemet, även om Go har metoder och även en OO-typ av programmering, finns det ingen typhierarki. Det enda sättet att uppnå det är genom gränssnitt.
Man bör läsa språkspecifikationen för att få en bättre förståelse för språkets designelement. Det är verkligen koncist och hjälper till att ta fram några riktigt intressanta detaljer. Det sätt som Go skiljer sig från andra typiska programmeringsspråk är att det har funktioner till skillnad från andra OO-språk:
Go-koden hålls under arbetsytor. Det är bara en kataloghierarki, enligt följande:
src
- innehåller Go-källfiler som paketpkg
- innehåller paketobjektbin
- innehåller körbara filerGo-verktyget bygger källkodspaket och installerar de resulterande binärerna i bin
och pkg
kataloger.
Låt oss bygga en statisk webbplats och fortsätta så att den förbättras så att den beter sig mycket dynamiskt, baserat på användarinmatning.
Kodstrukturen för den statiska sidan ser ut så här:
Så i huvudsak vill du skapa en struktur som liknar ovanstående bild eller som visas i förvaret. Denna repostruktur borde själv vara bosatt under arbetsyta
. Läs om Go Code Structure för mer information.
Nu vad vi vill göra är att servera en HTML-fil bosatt i den offentliga katalogen.
De index.html
innehållet är som följer:
Statisk webbplats med Go Utveckla webbplats med Go
Jag är en statisk sida som serveras för dig med hjälp av Go lang.
Och här är Go-programmet för att betjäna filer statiskt från den offentliga mappen:
paketets huvudsakliga import ("net / http") func main () fs: = http.FileServer (http.Dir ("public")) http.ListenAndServe (": 8080", fs)
Låt mig förklara:
Det är allt. Verkligen enkelt och till viss del. Du kan köra koden med följande: gå igång gostatic.go
.
Denna lösning skiljer emellertid inte tydligt från routing och betjäning, och därför skulle en bättre lösning vara i linje med:
paketets huvudsakliga import ("net / http" "logg") func main () fs: = http.FileServer (http.Dir ("public")) http.Handle ("/", fs) log.Println ...)) err: = http.ListenAndServe (": 8080", nil) om err! = Nil log.Fatal ("ListenAndServe:", err)
ListenAndServe
startar en HTTP-server på den angivna TCP-adressen och samtalar sedan Server med en hanterare. Denna hanterare är normalt noll, så att standardrutern (i Go's case the DefaultServerMux kan ta över).
Nu med avseende på DefaultServeMux - Låt oss ta en kort omväg för att förstå hur Go gör HTTP-bearbetning. Det gör det med hjälp av två primära saker.
Fortsätt och kör provprogrammets webbapplikation som gjort tidigare och du bör se produktionen!
Låt oss sedan skriva applikationen så att den skriver ut den aktuella tiden, vilket innebär att vid varje uppdatering får du en annan produktion. Go-koden skulle se ut så här:
paketet huvudimport ("fmt" "net / http" "tid") func main () http.HandleFunc ("/", hanteraren) log.Println ("listening ...") err: = http.ListenAndServe (": 8080 ", nil) om err! = nil panic (err) func handler (w http.ResponseWriter, r * http.Request) fmt.Fprintf (w," Hej. Tiden är: "+ time.Now ) .Format (tid.RFC850))
Här har vi importerat fmt
att arbeta med vissa utskriftsfunktioner. Fmt implementerar formaterade I / O-funktioner i linje med C: s stdio
bibliotek.
Vi har också utnyttjat HandleFunc
som registrerar URL-sökvägen med handlarfunktionen i DefaultServeMux. Funktionshanteraren är av typen http.HandlerFunc
. Det tar en http.ResponseWriter
och http.Request
som dess argument. Personer som är bekanta med Java servlets skulle komma ihåg att göra detta!
För att skriva ut tid importerar vi "tid" från standardpaketet och använder det för att svara på svarskrivarens objekt. Genom att skriva till http.ResponseWriter
objekt vi kan skicka svaret till klienten.
http.Request
är strukturen som representerar HTTP-förfrågan och har följaktligen hela förfrågningsdata. För att komma åt webbadressen som vi gör r.URL.path
.
När du kör detta och sedan åtkomst localhost: 8080
Du bör se aktuell tid vid varje uppdatering.
Låt oss nu skriva en ansökan som accepterar a Användarnamn
på indexsidan och sedan när formuläret skickas, hälsar det användaren på nästa sida.
Här är vår Go-kodstruktur:
Låt oss först skapa en HTML-fil som innehåller formuläret i den offentliga katalogen.
Gå Greeter Gå Greeter
Denna blankett, vid inlämning, kommer att omdirigera till /hälsa
. Låt oss också skriva innehållet i greet.html
filen i den offentliga katalogen, som vi skulle göra när begäran kommer till /hälsa
.
Gå Greeter Hej .
Go-koden är som följer:
paketet huvudimport ("log" "net / http" "html / mall") func main () http.HandleFunc ("/", root) http.HandleFunc ("/ greet", greeter) log.Println ...)) err: = http.ListenAndServe (": 8080", noll) om 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) användarnamn: = r.FormValue användarnamn ") t, _: = template.ParseFiles (" public / greeter.html ") err: = t.execute (w, användarnamn) om err! = nil http.Error (w, err.Error (), http .StatusInternalServerError)
Vi har använt html / mall
för att hålla HTML-koden i mallar och sedan använda dem för att göra på begäran.
Det är en nyfiken look .
i greeter.html
fil. De html / mall
paketet antar att vanlig text alltid produceras. Det lägger till att flyga när det är nödvändigt för att säkert bädda in den släta strängen i rätt sammanhang. När ett datavärde inte är vanlig text kan vi se till att det inte räddas genom att ange typ. Så väsentligt, Hallå, .!
kan åberopas genom att använda tmpl.Execute (ut, HTML ('Nishant'))
Att producera Hallå, Nishant!
. Fortsätt prova det!
Eftersom den grundläggande applikationen nu fungerar kan vi äntligen distribuera den till Heroku.
När du har Heroku-verktygsbälte korrekt inställning och repo hanteras via Git, kan vi distribuera det enligt dessa linjer.
Den enda förändring som vi skulle behöva göra i koden för att distribuera till Heroku är att ändra linjen där vi lyssna på en viss hamn.
Byta:
http.ListenAndServe (": 8080", ...)
till:
http.ListenAndServe ( ":" + os.Getenv ( "PORT"), ...
.
För att kunna distribuera till Heroku behöver du ett Heroku användarkonto. Du behöver också en Heroku kommandoradsklient. Få det genom att installera Heroku Toolbelt om det inte redan är.
När du är installerad, logga in med hjälp av Heroku-kontot genom att säga heroku login
, och ladda sedan upp din SSH-nyckel. Med dessa saker på plats borde du vara redo att distribuera till Heroku.
För att kunna distribuera till Heroku behöver vi appen lagras i Git.
git init. git add -A. git commit -m 'första heroku go app'
Vi kommer också att behöva en Procfile för att berätta för Heroku att det kommando som det behöver köras för webbprocessen är vår app.
echo 'web: gogreeter'> Procfile
Go paket beroende beror på Heroku med hjälp av Godep
paket.
Installera Godep och spara dina beroenden genom att använda följande:
gå och få github.com/kr/godep godp spara
Lägg till dessa nya filer till Git:
git add -A. git commit -m 'godep'
Slutligen skapa programmet Heroku. Det kan göras som så:
heroku skapa -b https://github.com/kr/heroku-buildpack-go.git
Detta bör skapa en Git-fjärrkontroll i ditt förråd med namnet på Heroku
. Du är redo att distribuera nu! Kör följande:
git push heroku master
När det här kommandot har slutförts bör din app vara igång!
Gå till webbadressen genom att säga heroku öppen
eller genom att direkt besöka app-webbadressen som du ser i konsolen.
Det är allt. Du har nu ett Go-program igång på Heroku!
I denna handledning lärde vi oss hur lätt det är att utveckla ett Go-webbprogram och även distribuera det på Heroku. Dessa dagar är webbutveckling i stor utsträckning beroende av de ramar man använder. För att utforska några av dessa alternativ bör du definitivt kolla några av dessa projekt.