Heim  >  Artikel  >  Backend-Entwicklung  >  Später wird der neue Wert dem zugrunde liegenden Objekt der Schnittstelle in go zugewiesen

Später wird der neue Wert dem zugrunde liegenden Objekt der Schnittstelle in go zugewiesen

WBOY
WBOYnach vorne
2024-02-14 11:24:09781Durchsuche

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

Der PHP-Editor Banana stellt Ihnen in diesem Artikel ein wichtiges Konzept vor: „Späteres Zuweisen neuer Werte zu den zugrunde liegenden Objekten der Schnittstelle in go“. Dieses Konzept ist in der Go-Sprache sehr verbreitet und ermöglicht es uns, die zugrunde liegenden Objekte der Schnittstelle zur Laufzeit dynamisch zu ändern und so eine flexiblere Programmierung zu ermöglichen. Auf diese Weise können wir die spezifische Implementierung der Schnittstelle ersetzen, ohne die Schnittstellendefinition zu ändern, und so eine Codeerweiterung und Flexibilität erreichen. In den folgenden Artikeln werden wir die Prinzipien und die Verwendung dieses Konzepts im Detail besprechen.

Frageninhalt

Ich versuche, der zugrunde liegenden Struktur einer Schnittstelle im folgenden Code neue Werte zuzuweisen. Aber es behält die alten Werte bei. Unten finden Sie Beispielcode.

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

Der Typ der Form ist in assignradius nicht im Voraus bekannt. Ich weiß, dass das mit Zeigern zu tun hat. Aber ich kann es nicht herausfinden. shape 的类型在 assignradius 中事先未知。我知道这与指针有关。但想不通。

解决方法

接口变量 s

Workaround

Schnittstellenvariable s enthält eine Kopie des Formwerts. Um es so zu ändern, wie Sie es versuchen, muss es einen Zeiger auf die Form enthalten: 🎜
var s shape
c := circle{radius: 0, name: "my circle"}
s = &c
🎜Und in der Funktion, die sie ändert, müssen Sie Assert-Zeigerwerte eingeben: 🎜
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
    }

Das obige ist der detaillierte Inhalt vonSpäter wird der neue Wert dem zugrunde liegenden Objekt der Schnittstelle in go zugewiesen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen