Ceci est une ancienne révision du document !
Notes et transcriptions du cours “Démarrer avec Go” proposée par University of California, Irvine disponible sur la plateforme coursera.
RFC signifie Request For Comments. C'est un document technique qui définit un protocole ou un format, une définition de standard.
La raison pour laquelle cela nous préoccupe n'est pas directement lié à un objectif, mais chaque fois que vous écrivez un programme, vous devez traiter des données, vous voudrez interagir avec d'autres systèmes, d' autres ensembles de données d'une manière ou d'une autre.
C'est extrêmement fréquent. Par exemple, vous souhaiterez peut-être que votre programme lise des fichiers provenant du web, s'interface avec des bases de données MySQL et traite les informations.
Il doit donc y avoir un format sur lequel tout le monde est d'accord, via lequel vous pouvez communiquer et votre code pourra traiter ce format.
Il en va de même pour les protocoles réseau. Vous souhaiterez peut-être développer une application client-serveur comme un client Web. Votre client Web doit communiquer avec un serveur via le réseau. Pour échanger avec un serveur, il doit envoyer des messages conformes à un protocole particulier. Le serveur comprend donc ce qu'il reçoit. Ensuite, à l'autre bout côté client, votre programme doit être capable de comprendre le format, le protocole du message qu'il à reçu en retour.
Ainsi, chaque fois que vous créez une application et qu'elle doit interagir avec d'autres systèmes, via des transferts de données, ces données doivent être mises en forme de manière à ce que tout le monde les comprenne.
Une grande partie de ces formats et de ces protocoles sont bien définis, normalisés et utilisés pour la communication et échanges de données entre différents systèmes. Ils sont nombreux et des RFC ont été écrites pour ces protocoles et la plupart de ces normes.
Prenons l'exemple du HTML pour HyperText Markup Language , le langage de balisage hypertexte. Le HTML est le langage dans lequel les pages Web sont écrites. C'est un langage standardisé et décrit par la RFC 1866. Tous les clients, tous les navigateurs Web doivent comprendre ce langage afin de savoir comment le mettre en forme à l'écran, etc.
C'est donc via l'un de ces langages normalisés que vous pouvez échanger des données entre un client Web et un serveur Web, en utilisant cette norme.
Pour les URI, il y a aussi la RFC 3986. URI signifie Unified Ressource Locator. C'est essentiellement la méthode d'adressage utilisée sur le Web : Vous connaissez l'URL, c'est un type d'URI. Il existe donc un format particulier qui doit être respecté afin que chaque client, chaque serveur puisse interpréter correctement l'adresse.
HTTP pour HyperText Transfert Protocole dédié aux échanges de données pour le Web. C'est la RFC 2616 qui décrit comment les messages doivent être transférés sur le réseau : quelles informations doivent être incluses dans chaque message et quels sont les en-têtes ; Où devraient se trouver les données, le contenu, etc. Tout cela est défini pour qu'un client Web puisse échanger avec un serveur Web.
Ce ne sont donc que quelques-uns des standards définis par les RFC. Ils sont très nombreux et certains d'entre eux peuvent être complexes.
Le langage Go fournit des packages qui vous aident à traiter un bon nombre de ces formats. Il existe des packages pour la plupart des RFC importants, il existe des packages déjà créés que vous pouvez importer dans vos programmes. Ces packages fournissent un ensemble de fonctions que vous utilisez pour encoder/décoder les données dans le format du protocole.
Si vous recevez des données dans un format particulier, vous devez décoder ces informations et les traduire en types traités par Go : structs, maps ou tout objet du Golang. Et inversement il faudra convertir les objets Go dans le format adapté au protocole pour transmettre les données.
A titre d'exemple, il y a un package “net/http” qui fournit un tas de fonctions qui vous permettent de créer des messages et de les envoyer.
http.Get(www.uci.edu)
Dans l'exemple ci-dessus on utilise http.Get()
qui produira un message “HTTP GET” lorsque vous passez en argument un domaine Web. Elle fera une demande de page Web à ce domaine et elle vous renverra le contenu de la page Web. Il existe donc un ensemble de fonctions comme celle-ci définies dans ce package qui vous permettent de communiquer sur le Web. Si vous souhaitez créer un client ou un serveur Web ce package vous sera très utile.
Un autre package plus bas niveau est le package “net”, destiné à la programmation TCP/IP et aux sockets. On n'entrera pas dans les détails mais le protocole TCP/IP définit essentiellement Internet. Internet vous permet de communiquer sur le Web, mais vous pouvez utiliser tout autre protocole de communication : FTP, Secure Shell etc.
Ils ont tous en commun de s'appuyer sur la pile TCP/IP et UDP/IP. Le package “net” vous fournit un ensemble de fonctions qui vous permettent d'utiliser ces protocoles.
net.Dial("tcp", "uci.edu:80")
Dans l'exemple ci-dessus on établi une connexion TCP avec la machine distante “uci.edu” sur le port 80.
vous le transmettez et il établit une communication ou une connexion, une connexion Internet, une connexion TCP spécifiquement avec uci.edu sur ce port particulier qui se trouve être un port Web mais, donc, il existe beaucoup de ces packages qui sont utilisés pour prendre en charge vous permettent, en tant que programmeur, d'utiliser facilement ces différents protocoles, protocoles de communication et formats de données qui sont couramment utilisés par différents systèmes. C'est juste très utile d'avoir ces packages et de les utiliser. Parce que lorsque vous ne les avez pas, vous devez le faire à partir de zéro, ce qui signifie que vous devez le faire. Par exemple, prenez le protocole HTTP. Si je n'avais pas le package HTTP, je devrais tout comprendre sur le protocole HTTP et créer moi-même les packages. Je dois essentiellement créer le format du message moi-même. Pour cela, je dois écrire mon propre code. Maintenant, ce n'est pas impossible, mais cela prend du temps. Pourquoi faire cela lorsque vous pouvez appeler Http.Get, cela vous facilite beaucoup la tâche en tant que programme. Donc, JSON est l'un de ces protocoles, ce n'est pas un protocole, c'est un format de données, un format de données couramment utilisé dans le monde entier et nous allons parler de cela et du package qui y est associé. JSON est donc l'abréviation de JavaScript Object Notation. Nous ne programmons pas en JavaScript mais JSON est plus grand que JavaScript. Aujourd'hui, le JSON est largement accepté comme un moyen courant de représenter des données structurées. C'est la RFC 759, c'est un format pour capturer des données structurées et des données non structurées, je veux dire un ensemble de paires de valeurs d'attributs. C'est donc naturel pour une structure ou une carte, n'est-ce pas ? Parce que si vous vous souvenez des structures, elles ont une clé, elles n'en ont pas, elles ne les appellent pas clés. Ils ont des champs et des valeurs de champs, non ? Ainsi, une paire de valeurs de champ peut être une paire de valeurs d'attribut et du JSON. Ou bien une carte possède des paires clé-valeur, n'est-ce pas ? C'est la même chose qui peut facilement être une paire attribut-valeur. Ainsi, ces paires de valeurs d'attributs et le JSON sont naturellement mappés. Bien entendu, non, je ne devrais pas utiliser le mot carte, il est naturellement corrélé aux tracés et aux cartes à l'intérieur de la ligne de go. Maintenant, les clés et les valeurs, ou plutôt les attributs et les valeurs tels qu'ils sont appelés en JSON, peuvent être des types de valeurs de base. Ainsi, vous pouvez prendre des bools, des nombres, des chaînes, des tableaux, des objets et ils peuvent être combinés hiérarchiquement. C'est donc plus facile si nous en voyons quelques exemples. Alors, prenons l'exemple d'une startup avec une structure Go, n'est-ce pas ? Une structure Go, la personne que nous avons frappée auparavant, n'est-ce pas ? Donc, cette structure de personne parfaite, je suis en train de créer P1. Je parle de la personne P1 avec le nom de Joe, l' adresse d'une rue et un numéro de téléphone, 123. Donc, ces informations, peut-être nous, s'ils veulent les transférer sur une autre machine, d'accord ? Nous allons le donner à quelqu'un. Nous voulons donc partir du moment où nous l'avons représenté sous forme de structure dans Go. Nous voulons représenter dans ce format JSON courant. Donc, quelqu'un d'autre, un autre programme, un autre système quelque part peut interpréter cela. Donc, ce que nous voyons ci-dessous est l'objet JSON équivalent. Donc, ci-dessus, vous voyez la structure telle que nous la définirions dans Go. En JSON, ce à quoi cela ressemblerait en tant qu'objet JSON est affiché ici. Notez que cela ressemble beaucoup à la structure, à l' apparence d'une structure ou à l'apparence d'une carte. En gros, c'est un nom : Joe. Adresse : rue. Téléphone : 123. Maintenant, une chose à noter est que le nom, les noms de leurs champs, les noms d'attributs, le nom, l'adresse, le téléphone sont entre guillemets, n'est-ce pas ? Ce qui n'était pas le cas lorsque nous avons défini la structure Go, nous ne les avons pas mis entre guillemets. Donc, c'est une petite différence mais remarquez que cela ressemble beaucoup à la structure, non ? Nous pouvons donc prendre cet objet JSON et le transmettre à une autre machine, à une partie du programme, et s'ils peuvent interpréter le JSON, ils pourront extraire toutes les informations que nous utilisions dans notre programme à propos de cette personne. Il s'agit bien sûr d'une seule personne, mais je peux avoir une base de données pleine de personnes. Je pourrais simplement faire passer un ensemble d'objets JSON à quelqu'un et il pourrait lire cette base de données pleine de personnes. Il ne s'agit donc que d'un simple exemple de JSON. Mais JSON est vraiment sympa et c'est un bon format, il est bien accepté.