Le site de référence est Tutoriel Wiki décrit dans GO Official. Cet article traite des URL ci-dessus, «Mise en route» et «Structures de données». Je pense qu'il est normal de jeter un coup d'œil rapide sur cette page sans faire de tutoriel
Commencez par créer un répertoire
$ mkdir gowiki
$ cd gowiki
Créez un fichier nommé wiki.go, ouvrez-le dans votre éditeur préféré et ajoutez la ligne suivante:
wiki.go
package main
import (
"fmt"
"io/ioutil"
)
--fmt ... Référence Packages requis pour implémenter les E / S de format --io / ioutil ... Référence Entrée / sortie facile des fichiers
En d'autres termes, vous avez besoin de deux packages pour saisir des caractères dans un fichier au format I / O et le télécharger, je vois!
Ensuite, définissez pour déterminer la structure de données
Commençons par définir la structure des données. Le wiki se compose d'une série de pages interconnectées, chacune avec un titre et un corps (contenu de la page). Ici, nous définissons Page comme une structure avec deux champs qui représentent le titre et le corps.
Il n'y a que le nom de fichier wiki
, et l'intention est que titre + contenu = une page, donc c'est facile à comprendre.
wiki.go
type Page struct {
Title string
Body []byte
}
type [] byte signifie "tranche d'octet". L'élément Body est un [] octet, pas une chaîne. En effet, il s'agit du type attendu dans votre bibliothèque io, comme décrit ci-dessous.
C'est lié à la raison pour laquelle j'ai importé les deux packages ci-dessus.
La structure de la page décrit comment les données de page sont stockées en mémoire. Mais qu'en est-il du stockage persistant? Vous pouvez gérer cela en créant une méthode de sauvegarde sur la page.
wiki.go
func (p *Page) save() error {
filename := p.Title + ".txt"
return ioutil.WriteFile(filename, p.Body, 0600)
}
La signature de cette méthode ressemble à ceci: "Il s'agit d'une méthode nommée save qui prend un pointeur p vers la page en tant que récepteur. Elle ne prend aucun paramètre et renvoie une valeur de type erreur."
Ici, seule la langue typée dynamiquement peut recevoir le pointeur p vers Page
en une phrase`? Je pense que ce sera (j'étais)
Il y avait un article Qiita qui expliquait quand je l'ai recherché.
Une variable pointeur est une variable qui peut être saisie avec une adresse en mémoire comme valeur.
Donc, dans cet exemple,
C'est ça!
Et encore un point
Ne prend pas de paramètres et renvoie les valeurs de type d'erreur
Une erreur ne revient-elle pas si la sauvegarde est réussie? Je pense qu'il y a des gens qui pensent cela. Il y a une explication à cela.
La méthode> save renvoie une valeur d'erreur car il s'agit du type de retour de WriteFile (une fonction de bibliothèque standard qui écrit des tranches d'octets dans un fichier). La méthode save renvoie une valeur d'erreur, permettant à l'application de gérer tout problème lors de l'écriture du fichier. Si tout se passe bien, Page.save () renverra nil (valeur nulle pour les pointeurs, les interfaces et certains autres types).
Si la sauvegarde réussit, nil est renvoyé au lieu d'une erreur.
Vient ensuite la fonction de chargement de page.
En plus de sauvegarder la page, vous voudrez charger la page.
wiki.go
func loadPage(title string) *Page {
filename := title + ".txt"
body, _ := ioutil.ReadFile(filename)
return &Page{Title: title, Body: body}
}
La fonction loadPage construit le nom du fichier à partir du paramètre title, charge le contenu du fichier dans le nouveau corps de la variable et renvoie un pointeur vers le littéral Page construit avec les valeurs de titre et de corps appropriées.
Si vous comprenez comment fonctionnent les pointeurs, vous pouvez facilement le comprendre. Il recherche simplement avec le paramètre de titre donné et apporte des données correspondantes.
Mais ici
body, _ := ioutil.ReadFile(filename)
Hmm? _Quoi?
Il y a aussi une explication, alors lisons-la.
La fonction peut renvoyer plusieurs valeurs. La fonction de bibliothèque standard io.ReadFile renvoie [] octets et une erreur. Le loadPage n'a pas encore traité l'erreur. L '«identificateur vide» représenté par le symbole de soulignement (_) est utilisé pour ignorer la valeur de retour de l'erreur (essentiellement aucune valeur n'est affectée à quoi que ce soit).
En d'autres termes, _ est ajouté pour ignorer la valeur d'erreur renvoyée. Si vous n'en avez pas besoin, pourquoi ne pas faire en sorte qu'il ne vous soit pas retourné?
Certaines personnes ont posé la même question dans About Underscore Variables. En raison de la nature du langage GO, si vous n'utilisez pas la variable déclarée, une erreur de syntaxe se produira, il semble donc qu'il y ait une intention d'omettre l'erreur si elle ne se produit pas définitivement.
Mais y a-t-il une garantie qu'il n'y aura pas d'erreur? Et si une erreur se produit? En premier lieu, il est délicat de porter ce jugement. Je pense que beaucoup de gens le pensent.
repos assuré. Il y a une explication à ce sujet.
Mais que faire si ReadFile rencontre une erreur? Par exemple, le fichier peut ne pas exister. N'ignorez pas ces erreurs. Modifions maintenant la fonction pour renvoyer une page et une erreur.
Ce sera un flux pour modifier la source ci-dessus.
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
}
L'appelant de cette fonction peut maintenant vérifier le deuxième paramètre. Sinon, vous obtiendrez une erreur que l'appelant pourra gérer.
Les deux problèmes sont résolus en vérifiant l'erreur avec l'instruction if et en ajoutant nil à la valeur de retour.
Ceci termine l'ajout de la source et entre le contrôle.
À ce stade, vous disposez d'une structure de données simple et vous pouvez enregistrer et lire des fichiers. Écrivons la fonction principale pour tester ce que nous avons écrit. Vous pouvez le compiler et l'exécuter comme ceci.
$ go build wiki.go
$ ./wiki
This is a sample Page.
Si vous l'exécutez et que le message «Ceci est une page d'exemple» s'affiche, cela signifie qu'il réussit.
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))
}
Je l'ai posté sous forme de mémo, donc ça ressemble à un gribouillage. Veuillez commenter si vous en avez!