Maison > développement back-end > Golang > Attribuer ultérieurement la nouvelle valeur à l'objet sous-jacent de l'interface en go

Attribuer ultérieurement la nouvelle valeur à l'objet sous-jacent de l'interface en go

WBOY
Libérer: 2024-02-14 11:24:09
avant
800 Les gens l'ont consulté

稍后将新值分配给 go 中接口的底层对象

l'éditeur php Banana vous présentera un concept important dans cet article : "Attribuer ultérieurement de nouvelles valeurs aux objets sous-jacents de l'interface en go". Ce concept est très courant dans le langage Go et il nous permet de modifier dynamiquement les objets sous-jacents de l'interface au moment de l'exécution, permettant ainsi une programmation plus flexible. De cette façon, nous pouvons remplacer l'implémentation spécifique de l'interface sans modifier la définition de l'interface, obtenant ainsi une expansion et une flexibilité du code. Dans les articles suivants, nous discuterons en détail des principes et de l’utilisation de ce concept.

Contenu de la question

J'essaie d'attribuer de nouvelles valeurs à la structure sous-jacente d'une interface dans le code ci-dessous. Mais il conserve les anciennes valeurs. Vous trouverez ci-dessous un exemple de code.

package main

import (
    "fmt"
    "math"
)

type Shape interface {
    Area() float64
}

type Circle struct {
    Radius float64
    Name   string
}

func (c Circle) Area() float64 {
    return math.Pi * c.Radius * c.Radius
}

type Rectangle struct {
    Length float64
    Width  float64
    Name   string
}

func (r Rectangle) Area() float64 {
    return r.Length * r.Width
}

func assignRadius(s Shape, radius float64, name string) {
    switch s := s.(type) {
    case Circle:
        s.Radius = radius
        s.Name = name
    case Rectangle:
        s.Length = radius
        s.Name = name
    }
}

func main() {
    var s Shape
    c := Circle{Radius: 0, Name: "My Circle"}
    s = c
    fmt.Println(s.Area())
    fmt.Println(c.Radius)
    fmt.Println(c.Name)
    assignRadius(s, 10, "My New Circle")
    fmt.Println(c.Radius)
    fmt.Println(c.Name)
}
Copier après la connexion

Le type de forme n'est pas connu à l'avance dans assignradius. Je sais que cela a à voir avec les pointeurs. Mais je n'arrive pas à comprendre. shape 的类型在 assignradius 中事先未知。我知道这与指针有关。但想不通。

解决方法

接口变量 s

Solution

La variable d'interface s contient une copie de la valeur de la forme. Pour le modifier comme vous essayez de le faire, il doit contenir un pointeur vers la forme : 🎜
var s shape
c := circle{radius: 0, name: "my circle"}
s = &c
Copier après la connexion
🎜Et dans la fonction qui les modifie, il faut taper affirmer les valeurs du pointeur : 🎜
func assignRadius(s Shape, radius float64, name string) {
    switch s := s.(type) {
    case *Circle:
        s.Radius = radius
        s.Name = name
    case *Rectangle:
        s.Length = radius
        s.Name = name
    }
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