Heim > Backend-Entwicklung > Golang > 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
Freigeben: 2024-02-14 11:24:09
nach vorne
807 Leute haben es durchsucht

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

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
Nach dem Login kopieren
🎜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
    }
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage