Go - Píšeme webovú aplikáciu 1/3

Vystavil tito100

13.09.2011

0
V najbližších 3 článkoch o Go sa pokúsime vytvoriť jednoduchú webovú stránku wiki. Popísané v tomto článku: Vytváranie dátovej štruktúry z load a save metódami; Predpokladaná znalosť: Skúsenosti s programovaním; Znalosť niektorých unixových príkazov;


Začíname


Pre vytvorenie webovej prezentácie cez Go potrebujete mať úspešne nainštalovaný Go aj z jeho súčastmi na vašom počítači Ďalej potrebujete Verejnú ip, poprípade virtuálny webový server
Inštalácia Go (Pozrite Návod na inštaláciu pre win).

Obsah tohto návodu, ako aj tých následujúcich, obsahuje preložený tutoriál z oficiálneho zdroja jazyka Go čerpaný na stránkach golang.org. Preklad neprešiel korektúrou, prepáčte preto prosím nie úplne spisovný slovosled na niektorých miestach.
V prípade nejasností z jazykom Go píšte prosím vaše otázky do komentárov.


Vytvoríme nový priečinok. Pokiaľ používate LiteIDE, kliknite na file/new -> Go Project -> name:gowiki, location:c:/go/project -> ok -> ok.
Poprípade vytvoríte priečinok c:/go/project/gowiki.
Vytvoríte súbor c:/go/project/gowiki/main.go do ktorého zapíšeme:
package main

import (
"fmt"
"io/ioutil"
"os"
)


V scripte sme importovali potrebné knihovny "fmt", "io/ioutil" a "os". Neskôr budeme importovať ešte ďalšie potrebné knižnice.

Dátové štruktúry


Môžeme začať definovaním dátových štruktúr. Wiki sa skladá z radu vzájomne prepojených stránok, z ktorých má každá titulok a obsah. Definujeme teda dátovú štruktúru s dvoma prvkami ktoré budu reprezentovať titulok (Title) a obsah (Body).
type Page struct {
Title string
Body []byte
}

Pod typom []byte rozumieme "byte slice". Element Body je []byte a nie string, a to kvôli knihovnám ktoré budeme používať (knižnica io používa tento typ, uvidíte nižšie).

Následujúca metóda sa stará o uloženie stránky do súboru:
func (p *Page) save() os.Error {
filename := p.Title + ".txt"
return ioutil.WriteFile(filename, p.Body, 0600)
}

Metódu môžeme prečítať ako : "Tato metóda save preberá ako prijímateľa(objekt) p (ukazovateľ na Page). Nepreberá žiadne parametre a na výsledku vráti hodnotu typu os.Error", v prípade úspechu nil (null).

Táto metóda zapíše obsah stránky do textového súboru, ako názov súboru sa použije titulok stránky (Title)

Metóda save navráti hodnotu typu os.Error pretože je to návratová hodnota funkcie WriteFile (funkcia štandardnej knihovny ktorá zapisuje vrstvy bytov do súboru). Metóda save vráti chybovú hodnotu, ktorá nám poslúži na zistenie či prebehlo všetko v poriadku, alebo sa vyskytla pri zápise chyba. Ak prebehne všetko vporiadku, tak metóda Page.save() navráti nil (čo je nulová hodnota pre ukazovatele, šablóny a niektoré ďalšie typy).

Celo číselná konštanta 0600, vložená na tretom argumente funkcie WriteFile indikuje, že súbor sa má vytvoriť z čítacími aj zapisovateľnými právami pre aktuálneho užívateľa.

Pravdaže budeme potrebovať stránky aj načítavať:
func loadPage(title string) *Page {
filename := title + ".txt"
body, _ := ioutil.ReadFile(filename)
return &Page{Title: title, Body: body}
}


Funkcia loadPage vytvorí názov súboru z titulku, prečíta obsah súboru do novej stránky, a vráti ukazovateľ na túto novú stránku.

Funkcie môžu vrátiť viacej výsledkov. Funkcia štandartnej knihovny io.ReadFile navráti []byte a os.Error. Pri načítaní stránky nieje chyba zachytená, "prázdny identifikátor" reprezentovaný podtržítkom (_) je používaný k nastaveniu chybovej správy "nikomu" (kedže návratové hodnoty sa musia prevziať všetky a v správnom poradí, ale nie vždy ich vyžadujeme, tak sa použije podtržitko ktoré hodnotu prevezme, ale neuloží)

Ale čo sa stane ak funkcia ReadFile vyhodí error? Napríklad, keby súbor neexistoval. Takúto chybu by sme nemali určite ignorovať. Poďme teda zmeniť metódu tak, aby navrátila *Page (ukazovateľ na novú stránku) a os.Error
func loadPage(title string) (*Page, os.Error) {
filename := title + ".txt"
body, err := ioutil.ReadFile(filename)
if err != nil {
return nil, err
}
return &Page{Title: title, Body: body}, nil
}

Pri volaní tejto funkcie môžeme teraz skontrolovať druhý návratový parameter, ak je nulový, tak je stránka úspešne načítaná.

V tejto chvíli máme hotovú jednoduchú dátovú štruktúru, ktorú sme schopný ukladať a načítať. Môžme si to otestovať.
func main() {
p1 := &Page{Title: "TestPage", Body: []byte("This is a sample Page.")}
p1.save()
p2, _ := loadPage("TestPage")
fmt.Println(string(p2.Body))
}

Po skompilovaní a spustení kódu bude vytvorený súbor z názvom TestPage.txt, obsahujúci obsah p1. Následne sa načíta tento súbor do novej štruktúry p2 a jej obsah sa vypíše do výsledku.

Pokiaľ používate LiteIDE, stačí stlačiť kombináciu kláves CTRL+F7, a dole v konzole by ste mali zbadať výsledok. Pokiaľ ste postupovali správne, mali by ste tam mať niečo takéto :
...
< action id="Run" >
< cmd="${TARGETPATH}" _cmd="C:/go/project/gowiki/gowiki.exe"/ >
< args=""/ >
This is a sample Page.

< exit code="0" msg="process exited normally"/ >
< /action >


Ak však používate iný editor, tak kód skompilujte pomocou neho, alebo ručne. Stačí spustiť konzolu cmd (ponuka start, vyhľadať cmd a kliknúť enter), a postupne napísať tieto príkazy :
cd c:/go/project/gowiki
8g main.go
8l main.8
8.out

ako ďalší riadok by sa mal zobraziť už náš obsah stránky, a to :
This is a sample Page.


Pokračovanie v budúcom článku

Zdrojový kód projektu

Hodnocení +66Líbí
Přečteno 630-krát

Komentáře

Přidat nový



Pro přispívání musíte být přihlášen



Poslední komentáře

Sousední akvárko

Nejčtenější

Nejlepší

Web Kreveta.net je unikátní sbírkou článků mapují proces tvorby her. Vedle návodů naleznete v krevetím akvárku i rozhovory s vývojáři, recenze, soutěže. Portál Kreveta.net připravují (řazeno abecedně): Akhera, Banane4joy, Bullet_catcher, Burák, Fire.js, Ikkju, Izual, Likandro, Makan, PepiCzech, StorN, Tior.
Akvárko vymaloval Tior, o chod filtrace se stará StorN (design a kód).
Copyright © 2010 Kreveta.net. Všechna práva vyhrazena.