Ce qui est et ce qui n'est pas dans Go. 2e partie

Bonjour à tous! Aujourd'hui, nous partageons la dernière partie de la traduction de l'article «Ce qui est et ce qui n'est pas dans Go. Nous vous rappelons que dans la première partie, nous avons parlé des éléments qui sont dans Go, aujourd'hui nous parlerons de ce qui n'est pas dans Go.

La traduction de ce matériel a été préparée en prévision du début d'un nouveau flux au cours de développeur de Golang .



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.




Articles non trouvés dans Go


Conversion de nombre implicite


En programmation, la conversion de type implique de changer le type de données d'un objet en un autre. La conversion implicite signifie que cette modification est effectuée automatiquement par l'interpréteur ou le compilateur. Par exemple, affecter une valeur int à une variable à laquelle une valeur à virgule flottante a été affectée précédemment. Cette conversion n'est pas disponible dans Go. Lorsqu'un type n'est pas mentionné lors de la déclaration d'une variable, un type approprié lui est affecté, par exemple, int, float, string, etc., en fonction de la syntaxe du littéral. Dans l'exemple ci-dessous, Go générera une erreur car il trouvera deux types de données différents et ne pourra pas travailler avec eux. Cela se produit car le compilateur Go convertit implicitement int en float64 .

 a := 1.0 // same as float64(1.0) b := 1 // same as int(1) fmt.Printf("%f", a*b) // invalid operation: a * b (mismatched types float64 and int) 

Constructeurs et destructeurs


La tâche des concepteurs est le traitement primaire et l'initialisation de l'objet, et le destructeur est de détruire l'objet après sa durée de vie et sa mémoire libre. Contrairement à d'autres paradigmes orientés objet, il n'y a pas de classes dans Go. Par conséquent, le concept de constructeurs et de destructeurs n'existe pas non plus.

Surcharge de l'opérateur


La surcharge des opérateurs est la manière dont les opérateurs peuvent effectuer des opérations définies par l'utilisateur. Les opérateurs se comportent en fonction des arguments passés. Par exemple, en C ++ + opérateur peut être utilisé pour combiner des chaînes, ainsi que pour ajouter deux entiers. La valeur «+» peut également être définie par l'utilisateur et modifiée en fonction des besoins du programme. En JavaScript, une opération de type '1' + 1 entraînera la sortie de la chaîne "11" raison de la priorité plus élevée des lignes. De telles définitions ne sont pas autorisées dans Go, les opérateurs fonctionnent strictement et n'effectuent des opérations qu'avec certains types d'arguments de données.

Valeurs par défaut


Go n'autorise pas les valeurs par défaut dans les prototypes de fonction ou lorsque les fonctions sont surchargées. La spécification du langage Go est exceptionnellement petite et spécifiquement prise en charge pour simplifier l'analyse. Contrairement à d'autres langues, où vous pouvez transmettre des valeurs par défaut / paramètres facultatifs à une fonction, dans Go, vous ne pouvez vérifier que si une valeur a été transmise. Une approche différente des valeurs par défaut dans Go serait quelque chose comme ceci.

 func Concat1(a string, b int) string { if a == "" { a = "default-a" } if b == 0 { b = 5 } return fmt.Sprintf("%s%d", a, b) } 

Héritage


Parce que Go ne suit pas la hiérarchie familière des classes de programmation orientée objet, les structures de Go ne sont pas héritées les unes des autres. En général, l'héritage est une procédure dans les langages POO dans laquelle une classe hérite des propriétés et de la méthode de classe de ses parents. L'héritage peut aller profondément dans plusieurs niveaux. Cependant, dans Go, une structure peut être compilée simplement en fournissant un pointeur ou en l'intégrant dans des structures collaboratives. Un exemple de composition sur Go est donné ci-dessous. Le remplacement des classes peut être une interface dans Go. Les interfaces existent dans d'autres langues, mais les interfaces Go sont implicitement satisfaites.

 type TokenType uint16 type Token struct { Type TokenType Data string } type IntegerConstant struct { Token *Token Value uint64 } 

Programmation générale


La programmation générique est une forme dans laquelle nous connectons des modèles connus sous le nom de génériques, qui ne sont pas vraiment le vrai code source, mais sont compilés par le compilateur pour les convertir en code source. Essayons de comprendre les modèles d'une manière simple. Considérez les modèles de programmation comme un formulaire. Nous créons un formulaire dans lequel les détails importants du modèle sont laissés en blanc et doivent être remplis plus tard lors de la compilation. Ensuite, lorsque nous devons créer quelque chose à partir de ce modèle, nous spécifions simplement les détails, par exemple, le type.

 template<typename T> class MyContainer { // Container that deals with an arbitrary type T }; void main() { // Make MyContainer take just ints. MyContainer<int> intContainer; } 

L'extrait ci-dessus est écrit en C ++. Le modèle n'est pas fourni avec un type, mais il est fourni lorsque le MyContainer est initialisé. Nous pouvons également spécifier d'autres types, tels que float , double , etc., selon nos besoins. Les modèles généralisés sont utiles lors de l'exécution d'algorithmes sur un ensemble de données de plusieurs types.

Exceptions


Une exception indique une condition raisonnable que l'application peut vouloir intercepter. Grâce à des exceptions, nous pouvons résoudre des situations dans lesquelles le programme peut ne pas fonctionner. Une exception vérifiée n'entraîne pas un arrêt complet de l'exécution; elle peut être interceptée et traitée. Go n'a pas d'exceptions, il n'a que des erreurs comme les interfaces et les erreurs intégrées. La principale différence entre les erreurs et les exceptions est qu'elles indiquent un problème grave et doivent être résolues immédiatement, de sorte que la programmation Go devient plus stricte. Les erreurs dans Go doivent être vérifiées explicitement à mesure qu'elles se produisent.

Macros


Les macros sont des macro-commandes. Il s'agit d'un moyen de minimiser les tâches de programmation répétitives en définissant une sortie prédéfinie pour un ensemble donné d'entrées. Par exemple, si nous voulons obtenir le carré d'un nombre en C, nous pouvons simplement écrire x * x , où x est une variable, mais nous pouvons également définir une macro qui renvoie le carré d'un nombre chaque fois que nous en avons besoin. Les macros ne sont pas des fonctions. Les macros ne sont pas disponibles dans Go.

 #define square(x) ((x) * (x)) int main() { int four = square(2); // same as 2 * 2 return 0; } 

Annotations de fonction


Les annotations sont un moyen d'associer des métadonnées à des paramètres de fonction. En Python, les annotations sont prises en charge syntaxiquement et sont complètement facultatives. Regardons un petit exemple pour décrire les annotations en Python.

 def foo(a: int, b: 'description', c: float) -> float: print(a+b+c) foo(1, 3, 2) // prints 6.0 foo('Hello ', , 'World!') // prints Hello World! 

Dans le code ci-dessus, les paramètres a , b et c annotés avec certaines métadonnées. a et c annotés c types int et float , tandis que b fourni avec une description de chaîne. foo une sortie spécifique, malgré le type d'arguments mentionnés dans les annotations.

Stockage de flux local


Le stockage de flux local est une méthode de programmation informatique qui utilise une mémoire statique ou globale localisée dans un flux. Il s'agit d'une zone statique où les données sont copiées pour chaque flux du programme. Lorsque plusieurs flux utilisent les mêmes données statiques pour la même tâche, ils peuvent les copier à partir du stockage de flux local plutôt que de les stocker seuls.

Conclusion


Go s'est concentré sur la simplicité et l'élégance. Il a une syntaxe rapide, petite et simple. Contrairement à d'autres langages POO, il a moins de concepts qui devraient être déposés dans la tête. Les créateurs de Go ont choisi la simplicité du langage sans ajouter de complexité multiplicative aux parties adjacentes du langage. Par conséquent, Go n'a pas de fonctionnalités qui rendent l'analyseur plus lent et plus grand. La simplicité est la clé d'un bon logiciel.
REMARQUE Les extraits de code de cet article sont copiés à partir de divers articles sur Internet.
C’est tout.

Lire la première partie

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


All Articles