Heim > Backend-Entwicklung > Golang > Geben Sie Assertion in Go ein: Warum kann „Switch on Non-Interface Value' nicht eingegeben werden und wie lässt sich das Problem beheben?

Geben Sie Assertion in Go ein: Warum kann „Switch on Non-Interface Value' nicht eingegeben werden und wie lässt sich das Problem beheben?

Susan Sarandon
Freigeben: 2024-11-13 10:56:02
Original
473 Leute haben es durchsucht

Type Assertion in Go: Why

Typ-Assertion in Go: Behebung des Fehlers „Typwechsel bei Nicht-Schnittstellenwert nicht möglich“

Beim Arbeiten mit Typ-Assertionen in Go: Es ist möglich, dass der Fehler „Schalter kann nicht für Nicht-Schnittstellenwert eingegeben werden“ auftritt. Lassen Sie uns anhand eines Beispiels mit einem benutzerdefinierten Typ untersuchen, was dies bedeutet und wie Sie es beheben können.

Bedenken Sie den folgenden Codeausschnitt:

package main

import "fmt"
import "strconv"

type Stringer interface {
    String() string
}

type Number struct {
    v int
}

func (number *Number) String() string {
    return strconv.Itoa(number.v)
}

func main() {
    n := &Number{1}
    switch v := n.(type) {
    case Stringer:
        fmt.Println("Stringer:", v)
    default:
        fmt.Println("Unknown")
    }
}
Nach dem Login kopieren

Wenn Sie diesen Code ausführen, werden Sie Folgendes tun Es kommt der Fehler „Schalter kann nicht für Nicht-Schnittstellenwert eingegeben werden.“ Dies zeigt an, dass die Typzusicherung für einen Nicht-Schnittstellenwert ausgeführt wird. In diesem Fall ist n ein Zeiger auf eine Zahlenstruktur, die keine Schnittstelle ist.

Die Lösung besteht darin, den Wert in eine Schnittstelle{} umzuwandeln, bevor versucht wird, den Typ zu bestätigen. Dies liegt daran, dass Typzusicherungen nur für Schnittstellenwerte durchgeführt werden können. Hier ist der korrigierte Code:

func main() {
    n := &Number{1}
    switch v := interface{}(n).(type) {
    case Stringer:
        fmt.Println("Stringer:", v)
    default:
        fmt.Println("Unknown")
    }
}
Nach dem Login kopieren

Wenn Sie nun den Code ausführen, wird „Stringer: 1“ ausgegeben. Dies liegt daran, dass die Umwandlung von n in interface{} die Behandlung als Schnittstellenwert für die Typzusicherung ermöglicht.

Das obige ist der detaillierte Inhalt vonGeben Sie Assertion in Go ein: Warum kann „Switch on Non-Interface Value' nicht eingegeben werden und wie lässt sich das Problem beheben?. 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