Maison  >  Article  >  développement back-end  >  Focus sur la syntaxe et l'utilisation des méthodes Golang

Focus sur la syntaxe et l'utilisation des méthodes Golang

PHPz
PHPzoriginal
2023-03-30 13:35:251063parcourir

Golang, en tant que langage relativement jeune, possède également sa propre méthode de mise en œuvre unique. Cet article se concentrera sur la syntaxe et l'utilisation des méthodes Golang.

1. Définition de méthode

Les méthodes peuvent être définies pour n'importe quel type dans Golang, y compris les types de référence et les types non-référence. Le format de définition de la méthode est le suivant :

func (t Type) methodName(parameterList) (returnList){
    //方法体
}

où t est le récepteur, Type représente le type du récepteur, methodName est le nom de la méthode, ParameterList et returnList représentent respectivement les paramètres de la méthode et les listes de valeurs de retour.

Le récepteur peut être un type valeur ou un type pointeur. Le symbole * ou & correspondant doit être ajouté lors de la définition de la méthode, par exemple :

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

2. Appel de méthode

L'appel de méthode dans Golang est similaire à l'appel de fonction, sauf qu'il faut fournir le destinataire correspondant lors de l'appel. Par exemple :

package main

import "fmt"

type Person struct {
    name string
}

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

func (p Person) GetName() string {
    return p.name
}

func main() {
    p := Person{name: "张三"}
    fmt.Println(p.GetName()) // 输出:张三
    p.SetName("李四")
    fmt.Println(p.GetName()) // 输出:李四
}

Dans l'exemple ci-dessus, une structure appelée Person est d'abord définie, qui contient un attribut name de type chaîne. Ensuite, deux méthodes sont définies : SetName et GetName, qui sont utilisées respectivement pour définir et obtenir la valeur de l'attribut name. Dans la fonction principale, une variable de type Personne p est d'abord créée, et sa méthode GetName est appelée, et la valeur de l'attribut de nom de p est affichée sous la forme "Zhang San". Ensuite, la méthode SetName a été appelée pour modifier la valeur en « John Doe », puis la méthode GetName a été appelée pour générer la valeur d'attribut de nom modifiée « John Doe ».

3. Récepteurs de valeurs et de pointeurs

Comme le montrent les exemples de code précédents, les méthodes peuvent être définies pour les types valeur ou les types pointeur. Alors, quelle est la différence entre ces deux méthodes ?

Remarque : différents types de récepteurs ne peuvent pas être attribués les uns aux autres.

1. Récepteur de valeur

Lorsque la méthode est définie, si le récepteur est un type valeur, alors le récepteur sera copié une fois lorsque la méthode est appelée. Par conséquent, les opérations effectuées sur l’instance copiée n’ont aucun impact sur l’instance d’origine. Par exemple :

package main

import "fmt"

type Person struct {
    name string
}

func (p Person) GetName() string {
    return p.name
}

func (p Person) SetName(name string) {
    p.name = name
}

func main() {
    p1 := Person{name: "张三"}
    p2 := p1
    p2.SetName("李四")
    fmt.Println(p1.GetName()) // 输出:张三
    fmt.Println(p2.GetName()) // 输出:李四
}

La méthode Setname définie par le récepteur de type valeur copiera la valeur d'origine une fois instanciée, donc p1 et p2 sont en fait deux instances différentes. Ainsi, lorsque p2 appelle la méthode SetName pour modifier la valeur de l'attribut, cela n'a aucun effet sur p1.

2. Récepteur de pointeur

Lorsque la méthode est définie, si le récepteur est de type pointeur, alors lorsque la méthode est appelée, l'objet pointé par le pointeur est réellement exploité. Si la méthode modifie l'objet, cela affectera directement l'objet d'origine. Par exemple :

package main

import "fmt"

type Person struct {
    name string
}

func (p *Person) GetName() string {
    return p.name
}

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

func main() {
    p1 := &Person{name: "张三"}
    p2 := p1
    p2.SetName("李四")
    fmt.Println(p1.GetName()) // 输出:李四
    fmt.Println(p2.GetName()) // 输出:李四
}

La méthode SetName définie par le récepteur de type pointeur modifiera directement la valeur d'attribut de l'objet pointé, et p1 et p2 pointent vers le même objet, donc lorsque l'un d'eux appelle la méthode SetName pour modifier la valeur d'attribut , l'autre objet Il est également influent.

4. Méthode d'intégration de structure

Golang permet l'intégration de structure, c'est-à-dire qu'une structure peut contenir des variables membres d'autres types de structure.

Lors de l'intégration d'une structure, vous pouvez ajouter * ou & avant le nom du type pour indiquer le type de pointeur intégré ou le type de valeur. Par exemple :

type Person struct {
    name string
}

func (p *Person) GetName() string {
    return p.name
}

type Employee struct {
    *Person
    age int
}

func main() {
    emp := &Employee{Person: &Person{"张三"}, age: 28}
    fmt.Println(emp.GetName()) // 输出:张三
}

Dans cet exemple, un type de structure Person est d'abord défini, qui contient un attribut name de type chaîne et une méthode GetName. Ensuite, un type de structure Employee est défini, le type de structure Persion est intégré et un attribut age de type entier est ajouté. Lors de l'instanciation finale de emp, utilisez la méthode d'initialisation des accolades pour initialiser un objet de ce type pour la propriété Persion. Lors de l'appel de la méthode GetName de emp, elle appelle en fait la méthode GetName de la propriété Persion à l'intérieur de emp, affichant ainsi "Zhang San".

5. Résumé

Les méthodes en Golang sont similaires aux méthodes de fonction, mais ont une portée de fonction plus claire. La méthode définie par le récepteur de type pointeur peut modifier directement la valeur d'attribut de l'objet, augmentant ainsi la flexibilité de la méthode et évitant la difficulté de réaffecter la valeur via la valeur de retour. Lors de l'utilisation de l'intégration de structure, le code redondant peut être évité, ce qui rend le programme plus concis.

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