Heim > Backend-Entwicklung > Golang > Warum führt ein Typwechsel mit mehreren Fällen in Go zu einem „undefinierten' Methodenfehler?

Warum führt ein Typwechsel mit mehreren Fällen in Go zu einem „undefinierten' Methodenfehler?

Patricia Arquette
Freigeben: 2024-12-18 14:42:09
Original
136 Leute haben es durchsucht

Why Does a Type Switch with Multiple Cases in Go Result in an

Typwechsel mit mehreren Fällen in Go

In Go können Sie mit einem Typwechsel einen Wert mehreren Typen zuordnen. Wenn jedoch mehrere Fälle in einem Typwechsel verwendet werden, ist das Verständnis der Variablentypzuweisungen von entscheidender Bedeutung.

Beachten Sie den folgenden Codeausschnitt:

package main

import (
    "fmt"
)

type A struct {
    a int
}

func (this *A) test() {
    fmt.Println(this)
}

type B struct {
    A
}

func main() {
    var foo interface{}
    foo = A{}
    switch a := foo.(type) {
        case B, A:
            a.test()
    }
}
Nach dem Login kopieren

Beim Ausführen dieses Codes wird ein Fehler ausgelöst: a .test undefiniert (Typ Schnittstelle {} ist Schnittstelle ohne Methoden). Dieser Fehler tritt auf, weil die Variable a trotz des Typwechsels den Typ interface{} beibehält.

Um dieses Verhalten zu verstehen, müssen wir uns auf die Go-Spezifikation beziehen:

"Der TypeSwitchGuard kann enthalten Wenn diese Form verwendet wird, wird die Variable am Anfang des impliziten Blocks in jeder Klausel deklariert. In Klauseln mit einem Fall, der genau einen Typ auflistet, hat die Variable andernfalls den Typ von Die Ausdruck im TypeSwitchGuard.“

Da in unserem Fall mehrere Typen (B und A) in der Case-Klausel angegeben sind, behält die Variable a den Typ des Ausdrucks im TypeSwitchGuard bei, nämlich interface{}. Das bedeutet, dass der Compiler uns nicht erlaubt, die test()-Methode auf einer Schnittstelle aufzurufen, da interface{} keine test()-Methode hat.

Um dieses Problem zu beheben, können wir Typzusicherungen verwenden, die dies zulassen uns zu behaupten, dass ein Wert einen bestimmten Typ hat. Hier ist eine aktualisierte Version des Codes, der Typzusicherungen verwendet:

package main

import (
    "fmt"
)

type A struct {
    a int
}

func (this *A) test() {
    fmt.Println(this)
}

type B struct {
    A
}

func main() {
    var foo interface{}
    foo = &B{}
    if a, ok := foo.(tester); ok {
        fmt.Println("foo has test() method")
        a.test()
    }
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWarum führt ein Typwechsel mit mehreren Fällen in Go zu einem „undefinierten' Methodenfehler?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage