Ce qui est et ce qui n'est pas dans Go. Partie 1

Bonjour à tous, à la veille du début d'un nouveau fil sur le cours "Golang Developer", nous voulons partager avec vous une traduction d'un article intéressant, dans la première partie dont nous comprenons les éléments qui sont dans Go. Allons-y.



Go a été créé avec un regard en arrière, et son package de base est vraiment bien composé: il a un garbage collection, des packages, des fonctions de première classe, une portée lexicale, une interface d'appel système et des lignes immuables, dont le texte est généralement encodé en UTF-8. Mais il a relativement peu de fonctionnalités et ne devrait pas augmenter leur nombre. Par exemple, il n'a aucune conversion numérique implicite, aucun constructeur ou destructeur, aucune surcharge d'opérateur, aucune valeur de paramètre par défaut, aucun héritage, aucun générique, aucune exception, aucune macro, aucune annotation de fonction et aucun stockage de flux local.

Avant de lire : Ci-dessus est un extrait du livre d'Alan A. A. Donovan et Brian W. Kernigan «Go Programming Language». page xiv. Les éléments mentionnés ci-dessous sont une explication brève et quelque peu incomplète des termes utilisés dans la conception d'un langage de programmation. J'ai essayé d'expliquer tous les concepts en termes de programmation sur Go. Tous les points mentionnés ci-dessous ne sont pas ma paternité, ils sont tirés d'autres extraits. Je ne protège en aucun cas Go ou toute autre langue.

Nous allons maintenant essayer de comprendre chaque terme en bref. Pour un débutant en programmation générale, connaître ces termes est très important. La signification de tous ces concepts est applicable dans tous les langages de programmation. Ces termes peuvent vous aider à faire la distinction entre différentes langues à un niveau fondamental.

Éléments qui sont dans Go


Collecte des ordures


Ce mécanisme est présent dans tout langage de programmation qui effectue une gestion automatique de la mémoire. Pour comprendre la récupération de place ou la gestion de la mémoire, vous devez d'abord comprendre comment la mémoire elle-même fonctionne. Lorsque vous travaillez avec un langage de programmation, le compilateur attribue divers espaces mémoire dans le système pour stocker des données, par exemple, la création d'une variable, la boucle dans un tableau, etc. L'allocation et la redistribution de la mémoire doivent être implémentées pour rendre le programme plus efficace avec la mémoire.

Dans un langage comme C, la mémoire est gérée manuellement. Si vous connaissez C, vous savez qu'il existe une fonction malloc qui alloue dynamiquement de la mémoire dans le système. Dans un langage de haut niveau tel que JavaScript ou Python, cette allocation est automatiquement effectuée par un programme appelé garbage collector. Comme son nom l'indique, son travail consiste à gérer la mémoire, à allouer de l'espace lorsque cela est nécessaire et à libérer la mémoire allouée lorsqu'elle n'est plus. Go implémente le garbage collection, afin que le programmeur n'ait pas à se soucier de la gestion de la mémoire.

Forfaits


L'emballage est la combinaison de tout le code source et des ressources en un seul objet appelé package. Le progiciel est pratique à bien des égards, comme une installation facile, le partage, l'ajout, le débogage, etc. Go possède un système de package intégré qui intègre la documentation, les fichiers binaires et les fichiers de code source. Le but de l'empaquetage est d'utiliser d'autres projets logiciels dans votre logiciel sans avoir à copier manuellement le code source.

Fonctions de première classe


Une fonction de première classe est une fonction qui peut être traitée comme n'importe quelle autre variable, c'est-à-dire qu'elle peut être affectée, renvoyée, exportée, passée en paramètre, etc. Regardez l'extrait de code suivant écrit en Go. La fonction qui imprime la chaîne hello world first class function affectée à la variable a . La variable a se comporte comme une valeur réelle en mémoire, mais elle peut également être appelée en fonction en ajoutant () à la fin. Vous pouvez également voir que la valeur de a est affichée de la même manière que toute autre variable. C'est le concept de base des fonctions de première classe.

 package main import ( "fmt" ) func main() { a := func() { fmt.Println("hello world first class function") } a() fmt.Printf("%T", a) } 

Portée lexicale


Une étendue dans un programme est similaire à un bloc ou une étendue dans laquelle la définition d'une variable / fonction est valide. Par exemple, une variable déclarée à l'intérieur d'une fonction ne conserve sa valeur qu'à l'intérieur de ce bloc fonction, c'est-à-dire entre accolades {} . Si vous essayez d'accéder à la valeur d'une telle variable en dehors de ce bloc fonction, le programme ne pourra pas la trouver.

 package main import “fmt” func main() { { v := 1 { fmt.Println(v) } fmt.Println(v) } fmt.Println(v) // “undefined: v” compilation error } 

Dans le fragment donné, il y a quatre zones de visibilité. Le premier est la région globale, le second est la fonction main () , le troisième est le premier bloc à l'intérieur de la fonction main et le quatrième est la région où fmt.Println est appelé pour la première fois. Des trois Println dernier lance une erreur de compilation. En effet, la définition de la variable v n'est disponible que dans les zones trois et quatre. Lorsque Println est appelé avec v passé en paramètre, le programme cherche d'abord sa définition dans la zone actuelle, lorsqu'il ne le trouve pas, il se déplace à l'extérieur dans la portée du parent et continuera de le faire jusqu'à ce qu'il trouve sa définition. C'est la portée lexicale - le programme commence à rechercher la définition des variables et des fonctions de la zone dans laquelle elles sont utilisées / appelées, et sort. Dans le dernier programme fmt.Println , il n'était pas possible de trouver la définition de v dans la zone actuelle ou dans les zones parentes, ce qui donne une erreur de compilation.

Interface d'appel système


Go est livré avec une interface d'appel système qui sert de référence aux appels système disponibles pour le système d'exploitation. Par exemple, l'ouverture et la lecture d'un fichier, les entrées et sorties, etc. Il intercepte les appels de fonction dans l'API et appelle l'appel système nécessaire dans le système d'exploitation.

Chaînes immuables


Bien que la syntaxe de Go soit similaire à C, elle a un avantage sur elle sous la forme de lignes immuables qui sont encodées en UTF-8. C'est-à-dire que les programmes écrits en Go peuvent former des chaînes utilisant de nombreuses langues et caractères. Dans un sens simple, les chaînes sont une combinaison / tableau / liste de caractères dans les langages de programmation. Comme les chaînes sont formées en combinant des caractères, leur composition peut être modifiée. Des caractères peuvent être ajoutés, supprimés, déplacés, etc. Nous considérons une méthode qui garantit l'immuabilité d'une chaîne après sa déclaration. Le concept de chaînes immuables n'est pas nouveau, dans les instances de chaînes Python, les objets ne peuvent pas être mutés, JavaScript a également des chaînes immuables et Ruby a ajouté Frozen String Literals dans 2.3. Mais, néanmoins, de nombreux langages populaires, tels que C ++, PHP, Perl, etc., n'ont pas de chaînes immuables.

Donc, sur ce point, la première partie de l'article a pris fin. Dans ce document, les éléments qui se trouvent dans Go ont été démontés, et à propos de ce qui n'est pas dans Go, vous pouvez le lire dans la deuxième partie de l'article .

Source: https://habr.com/ru/post/fr463461/


All Articles