
Vous avez peut-être pratiqué la syntaxe Go encore et encore, mais à moins d'avoir construit une application vous-même, vous n'avez pas ressenti la véritable sensation d'écrire une application dans Go.
.
Dans cet article de blog, nous allons créer une application CLI dans Go, appelons-la go-grab-xkcd. L'application extrait les bandes dessinées de XKCD et vous les fournit via des paramètres de ligne de commande. Fournissez diverses options de fonctionnement.
Nous allons construire l'intégralité de l'application en utilisant uniquement la bibliothèque standard Go sans utiliser de dépendances externes.
L'idée de cette application peut sembler un peu idiote, mais le but est de s'entraîner à écrire au niveau de la production (en quelque sorte ) code dans Go sans chercher à se faire acquérir par Google.
Et un bonus à la fin
Remarque : Cet article suppose que le lecteur est déjà familier avec la syntaxe et la terminologie de Go, et Entre débutant et intermédiaire.
Exécutons d'abord l'application avant de continuer
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | $ go-grab-xkcd --help
Usage of go-grab-xkcd:
-n int
Comic number to fetch ( default latest)
-o string
Print output in format: text/json ( default "text" )
-s Save image to current directory
-t int
Client timeout in seconds ( default 30)
$ go-grab-xkcd -n 323
Title: Ballmer Peak
Comic No: 323
Date : 1-10-2007
Description: Apple uses automated schnapps IVs.
Image: https:
$ go-grab-xkcd -n 323 -o json
{
"title" : "Ballmer Peak" ,
"number" : 323,
"date" : "1-10-2007" ,
"description" : "Apple uses automated schnapps IVs." ,
"image" : "https://imgs.xkcd.com/comics/ballmer_peak.png"
}
|
Copier après la connexion
Vous pouvez essayer d'autres options en téléchargeant et en exécutant l'application sur votre ordinateur.
À la fin de ceci. tutoriel, vous serez familiarisé avec les sujets suivants :
Réception des paramètres de ligne de commande
Conversion entre les structures JSON et Go
Effectuer des appels d'API
Créer des fichiers ( télécharger et enregistrer depuis le réseau)
Opérations sur les chaînes
Voici la structure du projet
1 2 3 4 5 6 7 8 9 10 11 12 | $ tree go-grab-xkcd
go-grab-xkcd
├── client
│ └── xkcd.go
└── model
└── comic.go
├── main.go
└── go.mod
go.mod - Go Modules file used in Go for package management
main.go - Main entrypoint of the application
comic.go - Go representation of the data as a struct and operations on it
xkcd.go - xkcd client for making HTTP calls to the API, parsing response and saving to disk
|
Copier après la connexion
1 : Initialiser le projet
Créer un go.mod file -
Copier après la connexion
Cela vous aidera dans la gestion des packages (pensez aux fichiers package.json en JS).
2 : API xkcd
xkcd est incroyable et vous n'avez besoin d'aucune inscription ni clé d'accès pour utiliser leur API. Ouvrez l'API xkcd "Documentation" et vous trouverez deux points de terminaison -
http://xkcd.com/info.0.json - Obtenez les dernières bandes dessinées
http://xkcd. com/614/info.0.json - Obtenez la bande dessinée spécifiée par numéro de bande dessinée
Ce qui suit est la réponse JSON de ces points de terminaison -
1 2 3 4 5 6 7 8 9 10 11 12 13 | {
"num" : 2311,
"month" : "5" ,
"day" : "25" ,
"year" : "2020" ,
"title" : "Confidence Interval" ,
"alt" : "The worst part is that's the millisigma interval." ,
"img" : "https://imgs.xkcd.com/comics/confidence_interval.png" ,
"safe_title" : "Confidence Interval" ,
"link" : "" ,
"news" : "" ,
"transcript" : ""
}
|
Copier après la connexion
Article lié à xkcd
2 : pour le modèle de création de bande dessinée
Selon la réponse JSON ci-dessus, nous créons une structure appelée ComicResponse dans comic.go dans le package modèle
1 2 3 4 5 6 7 8 9 10 11 12 13 | type ComicResponse struct {
Month string `json: "month" `
Num int `json: "num" `
Link string `json: "link" `
Year string `json: "year" `
News string `json: "news" `
SafeTitle string `json: "safe_title" `
Transcript string `json: "transcript" `
Alt string `json: "alt" `
Img string `json: "img" `
Title string `json: "title" `
Day string `json: "day" `
}
|
Copier après la connexion
Vous pouvez utiliser l'outil JSON-to-Go pour générez-le automatiquement à partir de la structure JSON.
Au fait, créez une autre structure qui sera utilisée pour sortir les données de notre application.
1 2 3 4 5 6 7 | type Comic struct {
Title string `json: "title" `
Number int `json: "number" `
Date string `json: "date" `
Description string `json: "description" `
Image string `json: "image" `
}
|
Copier après la connexion
Ajoutez les deux méthodes suivantes à la structure ComicResponse
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | func (cr ComicResponse) FormattedDate() string {
return fmt.Sprintf( "%s-%s-%s" , cr.Day, cr.Month, cr.Year)
}
func (cr ComicResponse) Comic() Comic {
return Comic{
Title: cr.Title,
Number: cr.Num,
Date : cr.FormattedDate(),
Description: cr.Alt,
Image: cr.Img,
}
}
|
Copier après la connexion
Ajoutez ensuite les deux méthodes suivantes à la structure Comic
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | func (c Comic) PrettyString() string {
p := fmt.Sprintf(
"Title: %s\nComic No: %d\nDate: %s\nDescription: %s\nImage: %s\n" ,
c.Title, c.Number, c. Date , c.Description, c.Image)
return p
}
func (c Comic) JSON() string {
cJSON, err := json.Marshal(c)
if err != nil {
return ""
}
return string(cJSON)
}
|
Copier après la connexion
3 : Configurez le client xkcd pour lancer une requête, analysez la réponse et enregistrez-la sur le disque
Créez xkcd dans le package client. go file.
Définissez d’abord un type personnalisé appelé ComicNumber, le type de données est int
tapez ComicNumber int
Définissez des constantes
1 2 3 4 5 6 7 8 | const (
BaseURL string = "https://xkcd.com"
DefaultClientTimeout time.Duration = 30 * time.Second
LatestComic ComicNumber = 0
)
|
Copier après la connexion
Créer une structure XKCDClient, qui servira à faire des requêtes à l'API.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | type XKCDClient struct {
client *http.Client
baseURL string
}
func NewXKCDClient() *XKCDClient {
return &XKCDClient{
client: &http.Client{
Timeout: DefaultClientTimeout,
},
baseURL: BaseURL,
}
}
|
Copier après la connexion
Ajoutez les 4 méthodes suivantes à XKCDClient
SetTimeout()
1 2 3 4 | func (hc *XKCDClient) SetTimeout(d time.Duration) {
hc.client.Timeout = d
}
|
Copier après la connexion
Fetch()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | func (hc *XKCDClient) Fetch(n ComicNumber, save bool) (model.Comic, error) {
resp, err := hc.client.Get(hc.buildURL(n))
if err != nil {
return model.Comic{}, err
}
defer resp.Body.Close()
var comicResp model.ComicResponse
if err := json.NewDecoder(resp.Body).Decode(&comicResp); err != nil {
return model.Comic{}, err
}
if save {
if err := hc.SaveToDisk(comicResp.Img, "." ); err != nil {
fmt.Println( "Failed to save image!" )
}
}
return comicResp.Comic(), nil
}
|
Copier après la connexion
SaveToDisk()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | func (hc *XKCDClient) SaveToDisk(url, savePath string) error {
resp, err := http.Get(url)
if err != nil {
return err
}
defer resp.Body.Close()
absSavePath, _ := filepath. Abs (savePath)
filePath := fmt.Sprintf( "%s/%s" , absSavePath, path.Base(url))
file, err := os.Create(filePath)
if err != nil {
return err
}
defer file.Close()
_, err = io. Copy (file, resp.Body)
if err != nil {
return err
}
return nil
}
|
Copier après la connexion
buildURL()
1 2 3 4 5 6 7 8 9 | func (hc *XKCDClient) buildURL(n ComicNumber) string {
var finalURL string
if n == LatestComic {
finalURL = fmt.Sprintf( "%s/info.0.json" , hc.baseURL)
} else {
finalURL = fmt.Sprintf( "%s/%d/info.0.json" , hc.baseURL, n)
}
return finalURL
}
|
Copier après la connexion
4 : Connectez tout
Dans la fonction main(), nous lions tout le contenu
lire les paramètres de ligne de commande
Instancier XKCDClient
Utiliser XKCDClient pour extraire les données de l'API
Sortie
Lire les paramètres de ligne de commande
1 2 3 4 5 6 7 8 9 10 11 12 | comicNo := flag.Int(
"n" , int(client.LatestComic), "Comic number to fetch (default latest)" ,
)
clientTimeout := flag.Int64(
"t" , int64(client.DefaultClientTimeout.Seconds()), "Client timeout in seconds" ,
)
saveImage := flag.Bool(
"s" , false, "Save image to current directory" ,
)
outputType := flag.String(
"o" , "text" , "Print output in format: text/json" ,
)
|
Copier après la connexion
flag.Parse()
instancier
Ou construisez-le en tant qu'exécutable binaire sur votre ordinateur portable et exécutez-le
1 2 | xkcdClient := client.NewXKCDClient()
xkcdClient.SetTimeout(time.Duration(*clientTimeout) * time.Second)
|
Copier après la connexion
Le code source complet peut être trouvé dans ce dépôt Github - allez-y -xkcd
Bonus supplémentaire
Vous pouvez télécharger plusieurs bandes dessinées en séquence en utilisant cet outil magique de shell simple
1 2 3 4 | comic, err := xkcdClient.Fetch(client.ComicNumber(*comicNo), *saveImage)
if err != nil {
log.Println(err)
}
|
Copier après la connexion
Le code shell ci-dessus appelle simplement go -grab-xkcd dans une commande de boucle for, puisque xkcd utilise des entiers de séquence, remplacez la valeur i par le numéro de bande dessinée comme numéro/ID de bande dessinée.
Tutoriels recommandés : "PHP
" "
Aller au didacticiel
"
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!