Update: Quelques modifications sont à prendre en compte suite à l’arrivée de la version 1 de Go (vous pouvez utiliser l’application gofix pour mettre à jour votre code et changer la version d’api de 3 à go1).
Le but de cet article est d’expliquer comment mettre en ligne une application AppEngine en Go.
Je ne vais pas m’étendre sur l’installation du SDK et sur la structure du langage :
Et en avant pour cette première application.
Développement d’un générateur de triangle de Sierpinski en Go
Ce programme tout bête utilise un algorithme binaire tout simple pour générer un triangle de Sierpinski dont la taille est paramétrable (paramètre passé en ligne de commande). Pour plus de détails, suivez les commentaires du programme.
26 | nbLignes, err = strconv.Atoi(flag.Arg(0)) |
34 | for i:=0; i<=(nbLignes - 1); i++ { |
36 | fmt.Print(strings.Repeat( " " , nbLignes -i)) |
Exemple de triangle généré :
*
* *
* *
* * * *
* *
* * * *
* * * *
* * * * * * * *
* *
* * * *
* * * *
* * * * * * * *
* * * *
* * * * * * * *
* * * * * * * *
* * * * * * * * * * * * * * * *
Modification du code pour tourner sur GAE
Nous allons maintenant nous attaquer à la version Google AppEngine.
Tout d’abord, installez le SDK (passez par le site en anglais pour pouvoir télécharger le sdk : http://code.google.com/intl/en/appengine/downloads.html)
Un programme Google AppEngine se base sur le package http de Go pour mettre en place un handler de connexion.
Exemple:
4 | http.HandleFunc( "/" , handler) |
7 | func handler(w http.ResponseWriter, r *http.Request) { |
8 | fmt.Fprint(w, "Hello" ); |
En première intention, nous allons faire un programme qui affiche un triangle de Sierpinski de 16 lignes, non paramétrable.
Il faudra alors :
- Modifier le nom de package (le package main est réservé aux programmes individuels)
- Ajouter une procédure init()
- Modifier la méthode main en handler HTTP
- Supprimer le code de paramétrage du nombre de lignes
- Supprimer les imports inutilisés
Voici ce que ça donne :
10 | http.HandleFunc( "/" , handler) |
13 | func handler(w http.ResponseWriter, r *http.Request) { |
16 | fmt.Fprint(w, "<html><pre>" ); |
19 | for i:=0; i<=(nbLignes - 1); i++ { |
21 | fmt.Fprint(w, strings.Repeat( " " , nbLignes -i)) |
34 | fmt.Fprint(w, "</pre></html>" ); |
Publication de l’application sur Google AppEngine
Pour publier sur GAE, votre application doit respecter une arborescence du type :
où app.yaml est le descripteur de l’application :
1 | application: sierpinski-go |
Les éléments à indiquer dans le fichier sont les suivants :
- L’identifiant de l’application (que vous déclarez lors de l’enregistrement de l’application dans GAE)
- La version de l’application (1 pour l’instant)
- La version d’API de go à utiliser
- Dans la partie handlers, il faut déclarer l’expression régulière servant à déclarer les pages devant être servies par le script; ici, toutes les pages
Si tout est ok, vous pouvez maintenant tester votre application :
1 | dev_appserver.py sierpinski/ |
Connectez votre navigateur sur http://localhost:8080 et vous devriez obtenir votre triangle 
Dernière étape : la publication.
Lancez alors la commande :
1 | appcfg.py update sierpinski/ |
Après quelques secondes, votre application sera disponible sur GAE.
Le résultat :
[ http://sierpinski-go.appspot.com ]
Bonus : paramétrer le nombre de lignes à afficher
Pour se faire plaisir et pousser un peu plus le concept, ajoutons un paramètrage du nombre de lignes à afficher :
11 | http.HandleFunc( "/" , handler) |
14 | func handler(w http.ResponseWriter, r *http.Request) { |
19 | nbLignesParam := r.FormValue( "nbLignes" ) |
20 | if nbLignesParam != "" { |
21 | nbConv, err := strconv.Atoi(nbLignesParam) |
22 | if err == nil && nbConv <= 64 { |
27 | fmt.Fprint(w, "<html><pre>" ); |
29 | for i:=0; i<=(nbLignes - 1); i++ { |
31 | fmt.Fprint(w, strings.Repeat( " " , nbLignes -i)) |
44 | fmt.Fprint(w, "</pre></html>" ); |
(peu de modifications : ajout de l’import strconv et parsing de l’url avec request.FormValue)
On redéploie !
1 | appcfg.py update sierpinski/ |
Si vous avez déjà déployé la version précédente, il faudra sélectionner la bonne version à publier dans la console appengine
Et voilà le résultat :
[ http://sierpinski-go.appspot.com/?nbLignes=64 ]
ou encore, la version 32 lignes :
*
* *
* *
* * * *
* *
* * * *
* * * *
* * * * * * * *
* *
* * * *
* * * *
* * * * * * * *
* * * *
* * * * * * * *
* * * * * * * *
* * * * * * * * * * * * * * * *
* *
* * * *
* * * *
* * * * * * * *
* * * *
* * * * * * * *
* * * * * * * *
* * * * * * * * * * * * * * * *
* * * *
* * * * * * * *
* * * * * * * *
* * * * * * * * * * * * * * * *
* * * * * * * *
* * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
[ http://sierpinski-go.appspot.com/?nbLignes=32 ]