Maison > développement back-end > Golang > Comment les fonctions génériques gèrent-elles les pointeurs et les types de référence dans Golang ?

Comment les fonctions génériques gèrent-elles les pointeurs et les types de référence dans Golang ?

王林
Libérer: 2024-04-16 16:06:02
original
595 Les gens l'ont consulté

Lorsqu'une fonction générique gère les types de pointeurs dans Go, elle recevra une référence à la variable d'origine, permettant de modifier la valeur de la variable. Les types de référence sont copiés lorsqu'ils sont transmis, ce qui rend la fonction incapable de modifier la valeur de la variable d'origine. Des exemples pratiques incluent l'utilisation de fonctions génériques pour comparer des chaînes ou des tranches de nombres.

Comment les fonctions génériques gèrent-elles les pointeurs et les types de référence dans Golang ?

Comment les fonctions génériques gèrent les types de pointeur et de référence dans Go

Introduction

Les génériques sont une fonctionnalité puissante qui nous permet de créer des fonctions capables de gérer différents types de données. Comprendre comment les fonctions génériques gèrent les types pointeur et référence est essentiel pour en tirer le meilleur parti.

Type de pointeur

Un pointeur est une variable qui pointe vers l'adresse mémoire d'une autre variable. Lorsque vous passez un pointeur en paramètre vers une fonction générique, la fonction reçoit une référence à la variable d'origine. Cela permet à la fonction de modifier la valeur de la variable.

import "fmt"

func PrintPointerValue[T any](ptr *T) {
    fmt.Println(*ptr)
}

func main() {
    num := 10
    PrintPointerValue(&num) // 输出 10
}
Copier après la connexion

Types de référence

Les types de référence utilisent des pointeurs pour partager des données entre différentes variables. Contrairement aux pointeurs, les types référence sont copiés lorsqu’ils sont transmis aux fonctions génériques. Cela empêche la fonction de modifier la valeur de la variable d'origine.

import "fmt"

type Person struct {
    Name string
}

func PrintPersonName[T any](r T) {
    if p, ok := r.(Person); ok { // 类型断言
        fmt.Println(p.Name)
    }
}

func main() {
    p := Person{Name: "John"}
    PrintPersonName(p) // 输出 John
}
Copier après la connexion

Cas pratique

Ce qui suit est un cas d'utilisation d'une fonction générique pour comparer deux chaînes ou tranches entières :

import "fmt"

func Equal[T comparable](a, b []T) bool {
    if len(a) != len(b) {
        return false
    }
    for i, v := range a {
        if v != b[i] {
            return false
        }
    }
    return true
}

func main() {
    str1 := []string{"a", "b", "c"}
    str2 := []string{"a", "b", "c"}
    fmt.Println(Equal(str1, str2)) // 输出 true

    num1 := []int{1, 2, 3}
    num2 := []int{1, 2, 3}
    fmt.Println(Equal(num1, num2)) // 输出 true
}
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:php.cn
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