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.
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
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
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!