Maison  >  Article  >  développement back-end  >  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
WBOYavant
2024-02-14 11:24:09778parcourir

稍后将新值分配给 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)
}

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
🎜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
    }

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer