Est-ce que Go est orienté objet?

Parfois, je lis un article qui dit «Go est orienté objet». Parfois, un autre article prétend qu'aucune programmation orientée objet ne peut être effectuée avec Go, simplement parce qu'il n'a pas de classes.

J'ai donc écrit ce post pour clarifier ce sujet. Est-ce que Go est orienté objet ou pas?

Si vous avez l'habitude de penser dans une langue particulière, selon la langue dont vous venez, vous pourriez avoir une vision différente de ce sujet. Par exemple, si vous venez de C, Go a clairement beaucoup plus de fonctionnalités de programmation orientées objet. Venant de Java, le code Go n'a pas l'air beaucoup orienté objet.

Ce que vous devez faire dans ce cas est d'arrêter de penser en termes de «l'autre langue» et de penser d'abord avec une mentalité Go.

Voici ma réponse:Oui, Go est orienté objet, et dans unrafraîchissantunesainchemin.

LeAller FAQdit:

Go est-il un langage orienté objet?

Oui et non. Bien que Go ait des types et des méthodes et permette un style de programmation orienté objet, il n'y a pas de hiérarchie de types. Le concept d '«interface» dans Go fournit une approche différente que nous pensons être facile à utiliser et à certains égards plus générale. Il existe également des moyens d'incorporer des types dans d'autres types pour fournir quelque chose d'analogue - mais pas identique - à la sous-classification. De plus, les méthodes en Go sont plus générales qu'en C ++ ou Java: elles peuvent être définies pour n'importe quel type de données, même des types intégrés tels que des entiers simples «sans boîte». Ils ne sont pas limités aux structures (classes).

De plus, l'absence de hiérarchie de types rend les «objets» dans Go beaucoup plus légers que dans des langages tels que C ++ ou Java.

Concepts de cueillette des cerises

Go a choisi certains concepts de la programmation procédurale, de la programmation fonctionnelle et de la programmation orientée objet, les a rassemblés et a laissé de côté d'autres concepts pour créer sa propre saveur unique de style de programmation idiomatique.

Pas de classes, entrez les structures

Il n'y a pas de classes dans Go, dans leur concept traditionnel, mais Go a des types de struct, qui sont beaucoup plus puissants que leursChomologue. Les types Struct plus leurs méthodes associées servent le même objectif d'une classe traditionnelle, où la structure ne contient que l'état, pas le comportement, et les méthodes leur fournissent un comportement, en permettant de changer l'état.

Encapsulation

L'une des meilleures fonctionnalités de Go: les champs, méthodes et fonctions en majuscules sont publics. Tous les autres champs sont locaux du package et ne sont pas exportés. D'un seul regard, vous savez si quelque chose est public ou privé. Il n'y a pasprotégécar il n'y a pas d'héritage.

Pas d'héritage

Il n'y a pas de notion d'héritage. À partir de la FAQ Go:

La programmation orientée objet, du moins dans les langages les plus connus, implique trop de discussions sur les relations entre les types, relations qui pourraient souvent être dérivées automatiquement. Go adopte une approche différente.

La composition plutôt que l'héritage

Ceprincipe bien connu, également mentionné dans le livre Gang of Four, se trouve beaucoup dans le code Go.

Lors de la déclaration d'une structure, nous pouvons ajouter un champ non nommé (anonyme), ce qui entraîne l'exposition de ses champs et de ses méthodes sur la structure. C'est appeléincorporation de structure:

package main

import ( “fmt” )

type Dog struct { Animal } type Animal struct { Age int }

func (a Animal) Move() { fmt.Println(“Animal moved”) } func (a Animal) SayAge() { fmt.Printf(“Animal age: %d\n”, a.Age) } func main() { d := Dog{} d.Age = 3 d.Move() d.SayAge() }

jouer

Interfaces

Oubliez les interfaces de style Java et PHP. Les interfaces Go sont très différentes, et un concept clé est que les interfaces sont satisfaitesimplicitement.

À partir de la FAQ Go:

Plutôt que de demander au programmeur de déclarer à l'avance que deux types sont liés, dans Go, un type satisfait automatiquement toute interface qui spécifie un sous-ensemble de ses méthodes.

Les interfaces sont généralement très petites, jusqu'à n'être qu'une seule méthode. Vous ne verrez pas de longues listes de méthodes dans idiomatic Go.

Les interfaces offrent élégammentpolymorphisme: en acceptant une interface, vous déclarez accepter tout type d'objet satisfaisant cette interface.

Méthodes

Les types ont des méthodes. Ils sont définis en dehors de la définition de type, avec une syntaxe qui pourrait rappeler leJavaScriptdéfinitions de méthode prototype:

function Person(first, last) {
    this.firstName = first;
    this.lastName = last;
}
Person.prototype.name = function() {
    return this.firstName + " " + this.lastName;
};
p = new Person("Flavio", "Copes")
p.name() // Flavio Copes

dans Go, le même code s'écrit:

package main

import ( “fmt” ) type Person struct { firstName string lastName string } func (p Person) name() string { return p.firstName + " " + p.lastName } func main() { p := Person{“Flavio”, “Copes”} fmt.Println(p.name()) }

Attacher des méthodes aux types

Les méthodes peuvent être associées à tout type, même aux types de données de base. Étant donné que les méthodes ne peuvent être attachées que dans le même package où le type est défini, nous ne pouvons pas «enrichir» les types de base intégrés, mais nous pouvons enrichir tout type nommé que nous créons avec une représentation sous-jacente du type de base:

package main

import ( “fmt” )

type Amount int

func (a Amount) Add(add Amount) { a += add }

func main() { var a Amount a = 1 a.Add(2) fmt.Println(a) }

jouer

Les fonctions

Pensez à un langage de programmation orienté objet traditionnel comme Java. Combien de fois avez-vous défini une classe «Utils» avec des méthodes statiques?

C'est pour contourner la notion que tout est un objet et que les définitions de fonction doivent être à l'intérieur de classes. Une telle chose ne se produit pas avec Go, car Go a des fonctions. Tout n'a pas besoin d'être un objet ou une méthode dans le monde réel. Les «classes» et les «objets» sont très utiles mais ils ne peuvent pas être utilisés pour tout.

Dans Go, tout n'est pas un objet (et techniquement rien n'est un objet, mais certaines personnes appellent des valeurs de type et des variables des «objets»), les méthodes sont des fonctions associées à un type, mais Go permet également aux fonctions de vivre en dehors d'un objet, tout comme C les fonctions.

Ainsi, bien que Go autorise les méthodes, il autorise également les fonctions, etfonctions de première classe(les fonctions peuvent être stockées sous forme de champs struct, peuvent être passées en tant qu'arguments à d'autres fonctions, peuvent être retournées à partir d'une valeur de retour de fonction ou de méthodes).

Moins de ballonnements

Dans l'ensemble, l'implémentation Go de la programmation orientée objet est incroyablementsoupleetdirect. Laissant derrière les classes et l'héritage, vous verrez très peu de passe-partout, et au lieu de raisonner sur la structure hiérarchique parfaite pour les classes, qui devient difficile à changer, vous avez la liberté de composer et de décomposer les types selon vos besoins.


Plus de tutoriels go: