Maison > développement back-end > Golang > Comment comprendre les tranches dans les structures Golang

Comment comprendre les tranches dans les structures Golang

WBOY
Libérer: 2024-02-08 21:45:12
avant
951 Les gens l'ont consulté

如何理解 Golang 结构体中的切片

Dans Golang, une structure est un type de données personnalisé qui peut contenir plusieurs champs. Dans une structure, une tranche est un tableau dynamique qui peut être étendu ou réduit selon les besoins. Cependant, comprendre les tranches dans les structures Golang peut prêter à confusion. Dans cet article, l'éditeur PHP Youzi vous expliquera en détail le principe de fonctionnement et l'utilisation des tranches dans la structure Golang, vous aidant ainsi à mieux comprendre et appliquer cette fonctionnalité. Que vous soyez débutant ou développeur expérimenté, cet article vous apportera de précieuses connaissances et conseils pratiques pour vous rendre plus à l'aise dans le développement Golang.

Contenu de la question

Je suis nouveau sur Golang et j'essaie de comprendre les pointeurs

type deque struct {
    indexes []int
}

func (d *deque) push(i int) {
    d.indexes = append(d.indexes, i)
}
Copier après la connexion

L'index ici est une tranche plutôt qu'un pointeur vers une tranche.

Comment les index sont-ils réellement stockés en mémoire ?

Par exemple : lorsque nous démarrons une instance deque, nous l'appelons dq, et en mémoire, l'adresse de dq est 0x1001 (nous l'appelons adr(dq)).

Quelles sont les variables stockées dans adr(dq) ? Est-ce un pointeur vers un tableau ?

0x1001 -> Ox8009 (l'adresse du premier élément du tableau)

Ou le tableau lui-même ?

0x1001 -> Le premier élément de la tranche

0x1002 -> Le deuxième élément de la tranche

Que se passe-t-il lorsque nous :

d.indexes = append(d.indexes, i)
Copier après la connexion

Quelle est la différence si on définit :

type deque struct {
    indexes *[]int
}
Copier après la connexion

Solution

Par exemple, l'adresse de l'instance deque en mémoire est 0x1001. Il initialise :

0x1001 -> [indexes: nil]
Copier après la connexion

Si vous ajoutez un nouvel élément (dq.push(12)) :

0x1001 -> [length: 1, capacity: 1, data: 0x3001 (pointer to data)]
0x3001 -> [12]
Copier après la connexion
La structure de tranche en

0x1001 contient des informations sur la longueur et la capacité de la tranche (longueur : 1, capacité : 1), les données réelles sont stockées à une autre adresse (disons 0x3001, tableau[12]).

Si vous poussez d'autres éléments (dq.push(34)、dq.push(56)).

0x1001 -> [length: 3, capacity: 4, data: 0x5001 (new pointer to data due to capacity, capacity doubles)]
0x5001 -> [12, 34, 56]
Copier après la connexion

Code 1 :

type deque struct {
    indexes []int
}
func (d *deque) push(i int) {
    d.indexes = append(d.indexes, i)
}
func main() {
    dq := deque{}
    dq.push(12)
    dq.push(34)
    dq.push(56)
    fmt.Println("Deque elements:", dq.indexes)
}
Copier après la connexion

Sortie 1 :

Deque elements: [12 34 56]
Copier après la connexion
Copier après la connexion

Si vous utilisez des pointeurs vers des tranches (*[]int) 而不是切片本身 ([]int). Cela signifie que le champ index contiendra un pointeur vers la tranche et que ce pointeur doit être initialisé avant de l'utiliser.

Si vous ajoutez un nouvel élément (dq.push(12)),则0x2001就是indexes), alors

est l'adresse de la structure de tranche sous-jacente pointée par index

0x1001 -> [indexes: 0x2001 (pointer to slice)]
0x2001 -> [length: 1, capacity: 1, data: 0x3001 (pointer to data)]
0x3001 -> [12]
Copier après la connexion
La structure de tranche en 0x2001

contient les informations de longueur et de capacité de la tranche (longueur : 1, capacité : 1), et les données réelles sont stockées à une autre adresse (0x3001, tableau[12]).

dq.push(34)、dq.push(56)Si vous poussez d'autres éléments (

).

0x1001 -> [indexes: 0x2001 (pointer to slice)]
0x2001 -> [length: 3, capacity: 4, data: 0x5001 (new data pointer, due to capacity, capacity doubles)]
0x5001 -> [12, 34, 56]
Copier après la connexion

Code 2 :

type deque struct {
    indexes *[]int
}

func (d *deque) push(i int) {
    if d.indexes == nil {    // initialize the slice if it's nil
        d.indexes = &[]int{}
    }
    *d.indexes = append(*d.indexes, i)
}

func main() {
    dq := deque{}
    dq.push(12)
    dq.push(34)
    dq.push(56)
    fmt.Println("Deque elements:", *dq.indexes)
}
Copier après la connexion

Sortie 2 : 🎜
Deque elements: [12 34 56]
Copier après la connexion
Copier après la connexion

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!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal