GoLang Tutorial – Web App Part 1

GCP-ICON.png

Bookmark and Share
wyszukiwanie stron bogotobogo.com:

Wprowadzenie

W tym poście dowiemy się jak zrobić prostą aplikację. Będzie ona miała kilka części i jest oparta na https://golang.org/doc/articles/wiki/.

Będzie to dobry dodatek do naszych szybkich podstawowych tutoriali, które ćwiczyliśmy do tej pory.

Rozpoczynanie

Utworzymy nowy katalog o nazwie gowiki gdzieś pod $GOTPAH:

$ echo $GOPATH~/go$ mkdir -p $GOPATH/src/github.com/einsteinish/go_tutorial/gowiki

Utwórz plik wiki.go w ten sposób:

initial_import.png

Importujemy pakiety fmt i ioutil z biblioteki standardowej Go. Później, gdy zaimplementujemy dodatkową funkcjonalność, dodamy więcej pakietów do tej deklaracji importu.

Definiowanie struktur danych

Wiki składa się z serii stron, z których każda ma tytuł i ciało (zawartość strony). Tutaj definiujemy Page jako struct z dwoma polami reprezentującymi tytuł i ciało.

type Page struct { Title string Body byte}

Typ byte oznacza wycinek bajtu.

Element Body jest bajtem, a nie łańcuchem, ponieważ jest to typ oczekiwany przez biblioteki io, których będziemy używać.

Struktura Page opisuje, w jaki sposób dane strony będą przechowywane w pamięci. Ale co z trwałym przechowywaniem danych? Możemy się tym zająć tworząc metodę save() na Stronie:

func (p *Page) save() error { filename := p.Title + ".txt" return ioutil.WriteFile(filename, p.Body, 0600)}

Metoda save() mówi „To jest metoda o nazwie save, która przyjmuje jako odbiornik p, wskaźnik do Strony. Nie przyjmuje ona żadnych parametrów i zwraca wartość typu error.”

Zauważ, że (p *Strona) przyjmuje następującą składnię:

receiver_syntax.png

Ta metoda zapisze ciało strony do pliku tekstowego. Dla uproszczenia, jako nazwy pliku użyjemy Title.

Metoda save zwraca wartość błędu, ponieważ taki jest typ zwrotu funkcji WriteFile (funkcja biblioteki standardowej, która zapisuje wycinek bajtu do pliku). Metoda zapisu zwraca wartość błędu, aby umożliwić aplikacji zajęcie się nim, gdyby coś poszło nie tak podczas zapisu pliku. Jeśli wszystko pójdzie dobrze, Page.save() zwróci nil (wartość zerową dla wskaźników, interfejsów i niektórych innych typów).

Oktalna liczba całkowita 0600, przekazana jako trzeci parametr do WriteFile, wskazuje, że plik powinien być utworzony z uprawnieniami do odczytu i zapisu tylko dla bieżącego użytkownika.

Oprócz zapisywania stron, będziemy chcieli również wczytywać strony:

func loadPage(title string) *Page { filename := title + ".txt" body, _ := ioutil.ReadFile(filename) return &Page{Title: title, Body: body}}

Funkcja loadPage konstruuje nazwę pliku z parametru title, wczytuje zawartość pliku do nowej zmiennej body i zwraca wskaźnik do literału Page skonstruowanego z odpowiednich wartości title i body.

Funkcje mogą zwracać wiele wartości. Funkcja biblioteki standardowej io.ReadFile zwraca bajt i błąd. W loadPage, błąd nie jest jeszcze obsługiwany; „pusty identyfikator” reprezentowany przez symbol podkreślenia (_) jest używany do wyrzucenia wartości zwracanej przez błąd (w istocie, przypisując wartość do niczego).

Ale co się stanie, jeśli ReadFile napotka błąd? Na przykład, plik może nie istnieć. Nie powinniśmy ignorować takich błędów. Zmodyfikujmy funkcję tak, aby zwracała *Strona i błąd.

func loadPage(title string) (*Page, error) { filename := title + ".txt" body, err := ioutil.ReadFile(filename) if err != nil { return nil, err } return &Page{Title: title, Body: body}, nil}

Wywołujący tę funkcję mogą teraz sprawdzić drugi parametr; jeśli jest on nil, to udało się załadować stronę. Jeśli nie, będzie to błąd, który może być obsłużony przez wywołującego.

W tym momencie mamy prostą strukturę danych i możliwość zapisywania do i ładowania z pliku. Napiszmy teraz funkcję main, aby przetestować to, co napisaliśmy:

func main() { p1 := &Page{Title: "TestPage", Body: byte("This is a sample Page.")} p1.save() p2, _ := loadPage("TestPage") fmt.Println(string(p2.Body))}

wiki-go-1.png

Po skompilowaniu i wykonaniu tego kodu został utworzony plik o nazwie TestPage.txt, zawierający zawartość strony p1. Plik ten zostałby następnie wczytany do struktury struct p2, a jego element Body wypisany na ekran.

TestPage-text.png

pakietnet/http

Zacznijmy od prostego serwera WWW podobnego do tego, który zrobiliśmy wcześniej (Web):

Simple_Web_Code.png

Funkcja main rozpoczyna się od wywołania http.HandleFunc, która mówi pakietowi http, aby obsługiwał wszystkie żądania do korzenia sieci („/”) za pomocą handler.

Następnie wywołuje http.ListenAndServe, określając, że powinien nasłuchiwać na porcie 8080 na dowolnym interfejsie („:8080”). (Na razie nie przejmuj się jej drugim parametrem, nil). Funkcja ta będzie blokować się aż do zakończenia programu.

ListenAndServe() zawsze zwraca błąd, ponieważ zwraca tylko wtedy, gdy wystąpi nieoczekiwany błąd. W celu zarejestrowania tego błędu zawijamy wywołanie funkcji za pomocą log.Fatal. Funkcja Fatal wywołuje os.Exit(1) po zapisaniu komunikatu do dziennika.

Przekaźnik funkcji jest typu http.HandlerFunc. Jako argumenty przyjmuje http.ResponseWriter i http.Request.

Wartość http.ResponseWriter składa odpowiedź serwera HTTP; zapisując do niej, wysyłamy dane do klienta HTTP.

An http.Request jest strukturą danych, która reprezentuje żądanie HTTP klienta. r.URL.Path jest składnikiem ścieżki adresu URL żądania. Trailing oznacza „utwórz podkrój ścieżki od 1. znaku do końca”. Powoduje to usunięcie wiodącego „/” z nazwy ścieżki.

Uruchom ten program i uzyskaj dostęp do adresu URL:

HiThereIlove.png

Dalej do Web Application Part 2 (Using net/http).

  1. Samouczek języka GoLang -… HelloWorld
  2. Przestrzenie robocze
  3. Kod Visual Studio
  4. Typy danych i zmienne
  5. bajt i runa
  6. Pakiety
  7. Funkcje
  8. . Tablice i plasterki
  9. Funkcja pobierająca i zwracająca plasterek
  10. Warunkowe
  11. Pętle
  12. Mapy
  13. Zakresy
  14. Wskaźniki
  15. Zamknięcia i funkcje anonimowe
  16. Struktury i metody odbiorników
  17. Odbiorniki wartości lub wskaźników
  18. Interfejsy
  19. Aplikacje internetowe Część 0 (Wprowadzenie)
  20. . Aplikacja internetowa Część 1 (Podstawy)
  21. Aplikacja internetowa Część 2 (Używanie net/http)
  22. Aplikacja internetowa Część 3 (Dodawanie możliwości „edycji”)
  23. Aplikacja internetowa Część 4 (Obsługa nieistniejącychnieistniejących stron i zapisywanie stron)
  24. Web Application Część 5 (Obsługa błędów i buforowanie szablonów)
  25. Web Application Część 6 (Walidacja tytułu za pomocą wyrażenia regularnego)
  26. Web Application Część 7 (Literały funkcyjne i zamknięcia)
  27. Budowanie obrazu Docker i wdrażanie aplikacji Go do klastra Kubernetes (minikube)
  28. Serverless Framework (Serverless Application Model-SAM)
  29. Serverless Web API with AWS Lambda
  30. Arrays vs Slices z próbką array left rotation
  31. Variadic Functions
  32. . Goroutines
  33. Channels (”
  34. Channels (”
  35. Channels (”
  36. Defer
  37. GoLang Panic and Recover
  38. String Formatowanie
  39. JSON
  40. SQLite
  41. Moduły 1 (Tworzenie nowego modułu)
  42. Moduły 2 (Dodawanie zależności)
  43. AWS SDK for Go (listing S3)
  44. Linked List
  45. Binary Search Tree (BST) Part 1 (Tree/Node structs with insert and print functions)

.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.