GO Offizielles Tutorial Hinweis 1

Zweck

--Schreiben von Notizen, um mit der GO-Sprache Schritt zu halten ――Da die Formel Englisch ist, fahren Sie fort, während Sie Japanisch + Anmerkungen hinzufügen (Übersetzung ist Deepl).

Einführung

Die Referenzseite ist Wiki Tutorial, beschrieben in GO Official. Dieser Artikel befasst sich mit den oben genannten URLs "Erste Schritte" und "Datenstrukturen". Ich denke, es ist in Ordnung, einen kurzen Blick auf diese Seite zu werfen, ohne ein Tutorial zu machen

Inhalt

Erstellen Sie zunächst ein Verzeichnis

$ mkdir gowiki
$ cd gowiki

Erstellen Sie eine Datei mit dem Namen wiki.go, öffnen Sie sie in Ihrem bevorzugten Editor und fügen Sie die folgende Zeile hinzu:

wiki.go


package main

import (
	"fmt"
	"io/ioutil"
)

--fmt ... Referenz Pakete, die zum Implementieren von Format-E / A erforderlich sind --io / ioutil ... Referenz Einfache Eingabe / Ausgabe von Dateien

Mit anderen Worten, Sie benötigen zwei Pakete, um Zeichen in eine Datei mit dem Format E / A einzugeben und hochzuladen.

Definieren Sie als Nächstes, um die Datenstruktur zu bestimmen

Beginnen wir mit der Definition der Datenstruktur. Das Wiki besteht aus einer Reihe miteinander verbundener Seiten mit jeweils einem Titel und einem Text (Seiteninhalt). Hier definieren wir Page als eine Struktur mit zwei Feldern, die den Titel und den Text darstellen.

Es gibt nur den Dateinamen "Wiki" und die Absicht ist, dass Titel + Inhalt = eine Seite, so dass es leicht zu verstehen ist.

wiki.go


type Page struct {
    Title string
    Body  []byte
}

Typ [] Byte bedeutet "Slice of Byte". Das Body-Element ist ein [] Byte, keine Zeichenfolge. Dies liegt daran, dass es sich um den Typ handelt, der in Ihrer Io-Bibliothek erwartet wird, wie unten beschrieben.

Es hängt mit dem Grund zusammen, warum ich die beiden oben genannten Pakete importiert habe.

Die Seitenstruktur beschreibt, wie Seitendaten im Speicher gespeichert werden. Aber was ist mit dauerhaftem Speicher? Sie können damit umgehen, indem Sie auf der Seite eine Speichermethode erstellen.

wiki.go


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

Die Signatur dieser Methode sieht folgendermaßen aus: "Dies ist eine Methode namens save, die einen Zeiger p als Empfänger auf die Seite nimmt. Sie akzeptiert keine Parameter und gibt einen Fehlertypwert zurück."

Hier kann nur die dynamisch typisierte Sprache den Zeiger p auf "Seite" in einem Satz empfangen. Ich denke es wird sein (ich war)

Es gab einen Qiita-Artikel, der erklärte, als ich ihn nachschlug.

Eine Zeigervariable ist eine Variable, die mit einer Adresse im Speicher als Wert eingegeben werden kann.

In diesem Beispiel also

Es ist das!

Und noch ein Punkt Nimmt keine Parameter und gibt Fehlertypwerte zurück

Wird bei erfolgreichem Speichern kein Fehler zurückgegeben? Ich denke, es gibt Leute, die das denken. Dafür gibt es eine Erklärung.

Die Methode> save gibt einen Fehlerwert zurück, da es sich um den Rückgabetyp von WriteFile handelt (eine Standardbibliotheksfunktion, die Byte-Slices in eine Datei schreibt). Die Speichermethode gibt einen Fehlerwert zurück, sodass die Anwendung alle Probleme beim Schreiben der Datei behandeln kann. Wenn alles gut geht, gibt Page.save () nil zurück (Nullwert für Zeiger, Schnittstellen und einige andere Typen).

Wenn das Speichern erfolgreich ist, wird anstelle des Fehlers nil zurückgegeben.

Als nächstes folgt die Funktion zum Laden von Seiten.

Zusätzlich zum Speichern der Seite möchten Sie die Seite laden.

wiki.go


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

Die Funktion loadPage erstellt den Dateinamen aus dem Parameter title, lädt den Inhalt der Datei in den neuen Variablenkörper und gibt einen Zeiger auf das Seitenliteral zurück, das mit den entsprechenden Titel- und Textwerten erstellt wurde.

Wenn Sie verstehen, wie Zeiger funktionieren, können Sie dies leicht verstehen. Es sucht nur mit dem angegebenen Titelparameter und bringt übereinstimmende Daten ein.

Aber hier body, _ := ioutil.ReadFile(filename) Hmm? _Was?

Es gibt auch eine Erklärung, also lasst es uns lesen.

Die Funktion kann mehrere Werte zurückgeben. Die Standardbibliotheksfunktion io.ReadFile gibt [] Bytes und einen Fehler zurück. Die loadPage hat den Fehler noch nicht behandelt. Die durch den Unterstrich (_) dargestellte "leere Kennung" wird verwendet, um den Rückgabewert des Fehlers zu verwerfen (im Wesentlichen wird keinem Wert zugewiesen).

Mit anderen Worten, _ wird hinzugefügt, um den zurückgegebenen Fehlerwert zu verwerfen. Wenn Sie es nicht benötigen, machen Sie es doch so, dass es nicht zurückgegeben wird.

Einige Leute haben die gleiche Frage dazu in Informationen zu Unterstrichvariablen (https://teratail.com/questions/58180) gestellt. Aufgrund der Art der GO-Sprache tritt ein Syntaxfehler auf, wenn Sie die deklarierte Variable nicht verwenden. Es scheint also beabsichtigt zu sein, den Fehler wegzulassen, wenn er nicht definitiv auftritt.

Aber gibt es eine Garantie dafür, dass es keine Fehler gibt? Was ist, wenn ein Fehler auftritt? Erstens ist es heikel, wenn Menschen dieses Urteil fällen. Ich denke, es gibt viele Leute, die das glauben.

seien Sie versichert. Es gibt eine Erklärung dafür.

Aber was ist, wenn ReadFile auf einen Fehler stößt? Beispielsweise ist die Datei möglicherweise nicht vorhanden. Ignorieren Sie solche Fehler nicht. Ändern wir nun die Funktion, um eine Seite und einen Fehler zurückzugeben.

Es wird ein Ablauf sein, die obige Quelle zu ändern.

wiki.go


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
}

Der Aufrufer dieser Funktion kann nun den zweiten Parameter überprüfen. Andernfalls erhalten Sie eine Fehlermeldung, die der Anrufer verarbeiten kann.

Beide Probleme werden gelöst, indem der Fehler mit der if-Anweisung überprüft und dem Rückgabewert nil hinzugefügt wird.

Damit ist die Quellenaddition abgeschlossen und die Prüfung erfolgt.

Zu diesem Zeitpunkt haben Sie eine einfache Datenstruktur und können in Dateien speichern und aus diesen lesen. Schreiben wir die Hauptfunktion, um zu testen, was wir geschrieben haben. Sie können es so kompilieren und ausführen.

$ go build wiki.go
$ ./wiki
This is a sample Page.

Wenn Sie es ausführen und die Meldung "Dies ist eine Beispielseite" angezeigt wird, ist es erfolgreich.

Volltext (Kopieren und Einfügen ist in Ordnung)

wiki.go


package main

import (
	"fmt"
	"io/ioutil"
)

type Page struct {
	Title string
	Body  []byte
}

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

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
}

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

Am Ende

Ich habe es als Memo gepostet, also sieht es aus wie eine Skizze. Bitte kommentieren Sie, wenn Sie welche haben!

Recommended Posts

GO Offizielles Tutorial Hinweis 1
Hinweis zu Zeigern (Go)
Django Girls Tutorial Hinweis
Memo
Memo
Memo
Probieren Sie das offizielle Django-Tutorial von Anfang an aus
Ein Memo, dass ich das Pyramid Tutorial ausprobiert habe