Maison > développement back-end > Golang > le corps du texte

Discussion approfondie de certains concepts clés et de l'utilisation des pointeurs de la méthode Go

PHPz
Libérer: 2023-04-25 13:55:33
original
560 Les gens l'ont consulté

Dans le langage Go, une méthode est une fonction liée à un certain type et peut être appelée via une instance de ce type. Go peut définir des méthodes pour n'importe quel type, y compris les types personnalisés (structures, interfaces) et les types intégrés (chaînes, tableaux, etc.), et même les types de pointeurs.

Dans Go, le pointeur est aussi un type. Le type pointeur peut pointer vers n’importe quel type de variable et la valeur de la variable peut être modifiée via le pointeur. Par conséquent, dans Go, les méthodes peuvent également être définies sur des types de pointeurs.

Ci-dessous, nous discuterons en profondeur de certains concepts clés et de l'utilisation des pointeurs de la méthode Go.

Types de valeurs et types de pointeurs

Regardons d'abord un exemple pour définir une structure Person : Person 结构体:

type Person struct {
    Name string
    Age  int
}
Copier après la connexion

现在我们可以定义一个接受 Person 类型参数的方法:

func (p Person) ChangeName(name string) {
    p.Name = name
}
Copier après la connexion

注意,这里的 pPerson 类型的值,而不是指针。因此,当我们调用上述方法时,会创建一个新的 Person 值,而修改不会影响原始变量。

person := Person{Name: "张三", Age: 20}
person.ChangeName("李四")
fmt.Println(person.Name) // 输出 "张三"
Copier après la connexion

为了避免这种情况,我们可以定义一个接受 Person 指针类型的方法,这样在方法内部修改 Person 变量时,不会创建一个新的 Person 变量,而是直接修改原始的 Person 变量。

func (p *Person) ChangeName(name string) {
    p.Name = name
}

person := &Person{Name: "张三", Age: 20}
person.ChangeName("李四")
fmt.Println(person.Name) // 输出 "李四"
Copier après la connexion

可以看到,当我们将 person 定义为指向 Person 类型的指针变量,并使用指针类型的方法 ChangeName() 修改 Name 属性时,原始的 Person 变量的 Name 属性会被修改。

指针方法和值方法的区别

在 Go 语言中,除了上述的修改变量值的能力之外,值方法和指针方法还有另外几个区别。

首先,指针方法可以修改接收者(类型本身),而值方法不能。

type Counter struct {
    count int
}

func (c *Counter) Add() {
    c.count++
}

func (c Counter) Get() int {
    return c.count
}

counter := Counter{count: 0}
counter.Add()
fmt.Println(counter.Get()) // 输出 1
Copier après la connexion

在上述代码中,Add() 方法是一个指针方法,用于增加计数器的值,而 Get() 方法是一个值方法,用于获取计数器的值。可以看到,在代码中,我们首先调用了 Add() 方法增加计数器的值,然后再通过 Get() 方法获取计数器的值。

另一个区别是在使用指针类型作为接收者时,可以避免在复制类型时发生内存分配,从而可以提高程序的性能。

func (p *Person) ChangeAge(age int) {
    p.Age = age
}

person := &Person{Name: "张三", Age: 20}
person.ChangeAge(21)
Copier après la connexion

在上述代码中,ChangeAge() 方法是一个指针方法,用于修改 Person 变量的 Age 属性。由于 Person 是一个结构体类型,因此在每次传递值类型的变量时会发生内存分配。但是,如果将 ChangeAge() 方法定义为指针方法,则可以避免发生内存分配。

非指针类型调用指针类型方法

在 Go 语言中,如果一个方法定义在指针类型上,但我们使用非指针类型调用该方法,编译器会自动转换为指针类型调用。

func (p *Person) ChangeName(name string) {
    p.Name = name
}

person := Person{Name: "张三", Age: 20}
person.ChangeName("李四")
fmt.Println(person.Name) // 输出 "李四"
Copier après la connexion

在上述代码中,我们将 person 定义为值类型的变量,但是通过 ChangeName() 方法来修改变量的值。在这种情况下,编译器会自动将 person 转换为指针类型,并调用 ChangeName()rrreee

Nous pouvons maintenant définir une méthode qui accepte les paramètres de type Person :

rrreee

Notez que p est ici une valeur de type Person, pas un pointeur. Ainsi, lorsque nous appelons la méthode ci-dessus, une nouvelle valeur Person est créée et la modification n'affecte pas la variable d'origine.

rrreee

Pour éviter cette situation, nous pouvons définir une méthode qui accepte le type de pointeur Person, de sorte que lorsque la variable Person est modifiée à l'intérieur de la méthode, une nouvelle sera ne pas être créée. variable code>Person, mais modifier directement la variable Person d'origine. 🎜rrreee🎜Vous pouvez le voir lorsque nous définissons person comme une variable de pointeur pointant vers le type Person et que nous utilisons la méthode de type pointeur ChangeName() Lorsque la propriété Name est modifiée, la propriété Name de la variable Person d'origine est modifiée. 🎜🎜La différence entre les méthodes de pointeur et les méthodes de valeur🎜🎜Dans le langage Go, en plus de la possibilité mentionnée ci-dessus de modifier les valeurs des variables, il existe plusieurs autres différences entre les méthodes de valeur et les méthodes de pointeur. 🎜🎜Tout d’abord, les méthodes pointeurs peuvent modifier le récepteur (le type lui-même), contrairement aux méthodes valeur. 🎜rrreee🎜Dans le code ci-dessus, la méthode Add() est une méthode pointeur utilisée pour augmenter la valeur du compteur, tandis que la méthode Get() est une méthode valeur used Obtenez la valeur du compteur. Comme vous pouvez le voir, dans le code, nous appelons d'abord la méthode Add() pour augmenter la valeur du compteur, puis obtenons la valeur du compteur via Get() méthode. 🎜🎜Une autre différence est que lors de l'utilisation d'un type pointeur comme récepteur, l'allocation de mémoire lors de la copie du type peut être évitée, ce qui peut améliorer les performances du programme. 🎜rrreee🎜Dans le code ci-dessus, la méthode ChangeAge() est une méthode de pointeur utilisée pour modifier la propriété Age de la variable Person. Puisque Person est un type de structure, l'allocation de mémoire se produit à chaque fois qu'une variable de type valeur est passée. Cependant, si vous définissez la méthode ChangeAge() comme méthode de pointeur, vous pouvez éviter l'allocation de mémoire. 🎜🎜Appel de méthodes de type pointeur à partir de types non-pointeur🎜🎜Dans le langage Go, si une méthode est définie sur un type pointeur, mais que nous appelons la méthode en utilisant un type non-pointeur, le compilateur la convertira automatiquement en type pointeur appel. 🎜rrreee🎜Dans le code ci-dessus, nous définissons person comme une variable de type valeur, mais modifions la valeur de la variable via la méthode ChangeName(). Dans ce cas, le compilateur convertit automatiquement person en type pointeur et appelle la méthode ChangeName(). 🎜🎜Résumé🎜🎜Dans le langage Go, l'utilisation de types et de méthodes de pointeurs est très courante. En créant une nouvelle méthode de type pointeur, nous pouvons éviter l'allocation de mémoire lors de la copie du type. Dans le même temps, les méthodes de pointage peuvent également modifier le récepteur. De plus, lors de l’appel d’une méthode de type pointeur à l’aide d’un type non-pointeur, le compilateur convertit automatiquement l’appel en type pointeur. Par conséquent, lors de l’écriture du code Go, il est recommandé d’utiliser les types et méthodes de pointeurs de manière flexible pour de meilleures performances et une meilleure structure du programme. 🎜

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!

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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!