Heim > Backend-Entwicklung > Golang > Go-Typ-Einschränkungen, die das Verhalten veränderlicher Strukturen beschreiben

Go-Typ-Einschränkungen, die das Verhalten veränderlicher Strukturen beschreiben

WBOY
Freigeben: 2024-02-08 21:15:10
nach vorne
697 Leute haben es durchsucht

描述可变结构行为的 Go 类型约束

php-Editor Xinyi stellt Ihnen heute eine Go-Typ-Einschränkung vor, die das Verhalten von Variablenstrukturen beschreibt. In der Go-Sprache können wir Schnittstellentypen verwenden, um eine Reihe von Methoden zu definieren und die Typen eingehender Parameter durch Typeinschränkungen einzuschränken. Diese Methode kann zur Kompilierungszeit eine Typprüfung durchführen, um die Sicherheit und Zuverlässigkeit des Codes zu gewährleisten. Durch die rationale Verwendung von Schnittstellentypen und Typbeschränkungen können wir Codeflexibilität und Skalierbarkeit erreichen und die Wartbarkeit und Lesbarkeit von Programmen verbessern. Schauen wir uns als Nächstes genauer an, wie man Go-Typ-Einschränkungen verwendet, um das Verhalten veränderlicher Strukturen zu beschreiben.

Frageninhalt

Ich möchte eine generische Funktion definieren, bei der Typbeschränkungen das Verhalten veränderlicher Strukturen beschreiben.

Was ich mit „veränderlichem Verhalten“ meine, ist eine Schnittstelle wie diese:

type Unmarshaler interface {
    Unmarshal(data []byte) error
}
Nach dem Login kopieren

...Die Umsetzung sieht so aus:

type Foo struct {
    Content string
}

func (f *Foo) Unmarshal(data []byte) error {
    f.Content = string(data)
    return nil
}
Nach dem Login kopieren

Aufrufen der Schnittstellenmethode ändert die Struktur .

Was ich tun möchte, ist eine generische Funktion zu definieren, bei der die Typbeschränkung die obige Schnittstelle ist. Generische Funktionen sind dafür verantwortlich, eine Instanz eines konkreten Typs zu initialisieren, sie dann mithilfe von Schnittstellenmethoden zu mutieren und zurückzugeben.

func Unmarshal[T Unmarshaler](data []byte) (T, error) {
    var m T
    return m, m.Unmarshal(data)
}
Nach dem Login kopieren

Ich möchte diese generische Funktion also mit dem Typ Foo aufrufen können.

func main() {
    foo, err := Unmarshal[*Foo]([]byte("hello"))
    if err == nil {
        log.Println(foo.Content) // hello
    } else {
        log.Fatal(err)
    }
}
Nach dem Login kopieren

Ich muss *Foo 作为类型参数,因为只有指向 Foo 的指针才实现 Unmarshaler 接口。但是,当 Foo 的 Unmarshal 方法收到 fnil 值时,就会出现恐慌。这对我来说都是有意义的,因为 var m T 将使指向 Foo einen Zeigerwert von Null, also Null, übergeben. Aber ich bin mir nicht sicher, ob ich in eine Sackgasse geraten bin?

https://go.dev/play/p/H5s59NWNiDA

Soweit ich es beschreiben kann, stoße ich immer dann auf dieses Problem, wenn meine Typeinschränkungen ein veränderbares Strukturverhalten beschreiben und meine generische Funktion die Instanz der Struktur initialisieren und dann mutieren möchte. Ist es möglich? Gibt es eine bessere Möglichkeit, dies zu bauen?

Workaround

Das Kernproblem besteht darin, den Wert für bestimmte Typen im Paket zu erstellen, aber es wäre einfacher, den Aufrufer den Wert als Parameter übergeben zu lassen. T 创建有用的值。有几种方法可以做到这一点: m := make(T) (地图和频道)等。您可以使用 reflect

func Unmarshal[T Unmarshaler](m T, data []byte) (T, error) {
    return m, m.Unmarshal(data)
}
Nach dem Login kopieren

Rufen Sie die Funktion wie folgt auf:

foo, err := Unmarshal(&Foo{}, []byte("hello"))
Nach dem Login kopieren

https://www.php.cn/link/8eb51d0a68e9373df41f88e5b551d4a3

Das obige ist der detaillierte Inhalt vonGo-Typ-Einschränkungen, die das Verhalten veränderlicher Strukturen beschreiben. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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