Maison  >  Article  >  développement back-end  >  Types de données de référence et types de données de valeur en langage Go

Types de données de référence et types de données de valeur en langage Go

PHPz
PHPzoriginal
2023-06-01 09:12:11747parcourir

Le langage Go est un langage fortement typé, dans lequel les types de données peuvent être divisés en deux types : les types de données de référence et les types de données de valeur. Les types de données de référence et les types de données de valeur sont légèrement différents dans leur utilisation. Examinons de plus près ces deux types de données.

1. Types de données de référence

Les types de données de référence incluent des tranches, des cartes, des canaux, des interfaces et des pointeurs en langage Go. Pour les types de données de référence, la valeur d'une variable n'est pas seulement sa propre valeur, mais un pointeur vers une adresse mémoire. Par conséquent, lorsque nous déclarons une variable de type référence, une adresse mémoire lui est allouée et stockée sur la pile, et l'espace pointé par l'adresse mémoire est stocké dans le tas.

  1. Slices

Une tranche est un tableau dynamique qui peut automatiquement s'agrandir ou se réduire selon les besoins. En prenant comme exemple une tranche de chaîne, la déclaration et l'initialisation sont les suivantes :

var s1 []string // Déclarez la tranche
s1 = make([]string, 3) // Utilisez la fonction make pour initialiser la tranche
s2 := []string{ "foo", "bar", "baz"} // Déclare et initialise directement la tranche

Dans le langage Go, une tranche est un pointeur vers les données sous-jacentes, et contient également la longueur et capacité de la tranche, c'est-à-dire la valeur renvoyée par les fonctions len et cap. Lorsque le nombre d'éléments dans une tranche dépasse la capacité, le langage Go réallouera un espace mémoire plus grand puis copiera les éléments d'origine dans le nouvel espace mémoire.

  1. Mapping

Map est une collection non ordonnée de paires clé-valeur, définie à l'aide du mot-clé map dans le langage Go. En prenant un mappage de chaîne comme exemple, la déclaration et l'initialisation sont les suivantes :

m1 := make(map[string]int) // Utilisez la fonction make pour initialiser le mappage
m2 := map[string]int{" foo": 1, " bar": 2, "baz": 3} // Déclarez directement le mappage et initialisez-le

Dans le langage Go, le mappage est également un pointeur vers les données sous-jacentes, et contient également le nombre de éléments cartographiés. Lorsque le nombre d'éléments dans la carte dépasse la capacité mémoire sous-jacente, le langage Go réalloue un espace mémoire plus grand.

  1. Channel

Channel est un moyen de transférer des données entre plusieurs Ctrips. Dans le langage Go, utilisez la fonction make et l'opérateur <- pour déclarer un canal. En prenant un canal de chaîne comme exemple, la déclaration et l'initialisation sont les suivantes :

var ch1 chan string // Déclarez le canal
ch1 = make(chan string) // Utilisez la fonction make pour initialiser le canal
ch2 := make (chan string, 3) / / Utilisez la fonction make pour initialiser le canal tamponné
ch1 <- "foo" // Envoyer des données au canal
data := <-ch1 // Lire les données du canal

In Dans le langage Go, un canal est également un pointeur A vers les données sous-jacentes, contenant à la fois la capacité du canal et le nombre actuel d'éléments. Lorsque le nombre d'éléments dans le canal dépasse la capacité, le langage Go bloquera le Ctrip actuel et attendra que d'autres Ctrips suppriment les éléments.

  1. Interface

Une interface est un type de données qui définit un ensemble de méthodes d'interface. En prenant une interface simple comme exemple, la déclaration est la suivante :

type Caller interface {
Call() bool
}

Dans le langage Go, l'interface est également un pointeur vers les données sous-jacentes, pointant vers la structure qui implémente l'interface. Les interfaces sont plus rapides que les types valeur car les méthodes d’interface ne sont pas copiées par les opérations d’implémentation.

  1. Pointeur

Un pointeur est une variable qui contient une adresse mémoire. Les opérateurs & et * permettent de déclarer et d'utiliser des pointeurs en langage Go. En prenant comme exemple un pointeur vers une variable de type chaîne, déclarez-le et utilisez-le comme suit :

var p1 *string // Déclarez le pointeur
s1 := "foo"
p1 = &s1 // Pointez le pointeur vers l'adresse mémoire de la variable chaîne
fmt.Println("s1:", s1, "p1:", *p1) // Récupère la valeur d'une variable chaîne via un pointeur

En langage Go, la variable pointée par le pointeur a besoin à déclarer à l'avance Il n'y a rien de similaire aux opérateurs de pointeur du langage C dans le langage Go.

2. Types de données de valeur

Les types de données de valeur dans le langage Go incluent les booléens, les entiers, les nombres à virgule flottante, les nombres complexes, les caractères, les chaînes et les tableaux. Pour les variables de type valeur, la valeur de la variable et la variable elle-même sont stockées sur la pile.

  1. Type booléen

Le type booléen n'a que deux valeurs en langage Go : vrai et faux. Étant donné que le type booléen ne comporte qu’un seul octet, il peut réduire efficacement l’empreinte mémoire lorsqu’il est utilisé en grande quantité.

  1. Entiers

Les entiers du langage Go sont divisés en entiers signés et les entiers non signés sont divisés en int8, int16, int32 et int64, et les entiers non signés sont divisés en uint8, uint16 et uint32 et uint64. Lors de l'utilisation, il est recommandé d'utiliser autant que possible les types int et uint, car la largeur d'octets de ces deux types est la même sur différentes plates-formes.

  1. Type à virgule flottante

Le type à virgule flottante dans le langage Go est divisé en deux types : float32 et float64. La valeur par défaut est le type float64. Lors de son utilisation, il est recommandé d'utiliser le type float64 autant que possible, car la vitesse de calcul et la précision de ce type sont supérieures à celles du type float32.

  1. Type de nombre complexe

Le type de nombre complexe utilise les types complexe64 et complexe128 en langage Go pour représenter des nombres réels et des nombres imaginaires. Par exemple, le type complex64 indique que la partie réelle et la partie imaginaire sont des nombres complexes de type float32.

  1. Type de caractère

Le type de caractère est représenté par une rune dans le langage Go. La plage d'identification du type rune et du type int32 est la même. En langage Go, vous pouvez utiliser des guillemets simples pour représenter les caractères.

  1. String

String est une séquence de caractères en lecture seule en langage Go, et des guillemets doubles sont utilisés pour représenter des chaînes en langage Go. Les chaînes en langage Go sont codées en UTF-8.

  1. Array

Array est un type de données avec une longueur fixe et le même type d'élément en langage Go. Lorsque vous l'utilisez, vous devez déclarer à l'avance la longueur et le type d'élément du tableau.

Conclusion

Les types de données de référence et les types de données de valeur sont légèrement différents dans l'utilisation du langage Go. Grâce à la comparaison, on peut constater que les types de données de valeur sont stockés dans la pile et. les variables sont en mémoire. L'emplacement dans une variable ne change pas au fil du temps (si les opérations de pointeur ne sont pas utilisées), tandis que la valeur d'une variable de type de données de référence est un pointeur vers une adresse mémoire allouée dans le tas. En utilisation réelle, les types de données de référence et les types de données de valeur doivent être utilisés de manière rationnelle pour obtenir des performances et des effets optimaux.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn