Heim > Backend-Entwicklung > Golang > Wie kann ich die Größe einer beliebigen Go-Struktur generisch bestimmen?

Wie kann ich die Größe einer beliebigen Go-Struktur generisch bestimmen?

DDD
Freigeben: 2024-11-26 07:58:08
Original
945 Leute haben es durchsucht

How Can I Generically Determine the Size of Any Go Structure?

So erstellen Sie eine generische Funktion zur Bestimmung der Größe einer beliebigen Struktur in Go

Eine der am häufigsten ausgeführten Aufgaben in der Programmierung ist die Bestimmung der Größe einer Struktur. In Go kann dies mit der Funktion unsafe.Sizeof erreicht werden. Allerdings ist das Erstellen einer generischen Funktion, die jede Art von Struktur verarbeiten kann, etwas anspruchsvoller.

Problem

Ein gängiger Ansatz zum Erstellen einer generischen Funktion ist die Verwendung von Schnittstellen und Reflexion. Die Verwendung dieses unten gezeigten Ansatzes führt jedoch zu falschen Ergebnissen:

package main

import (
    "fmt"
    "reflect"
    "unsafe"
)

func main() {
    type myType struct {
        a int
        b int64
        c float32
        d float64
        e float64
    }
    info := myType{1, 2, 3.0, 4.0, 5.0}
    getSize(info)
}

func getSize(T interface{}) {
    v := reflect.ValueOf(T)
    const size = unsafe.Sizeof(v)
    fmt.Println(size)
}
Nach dem Login kopieren

Dieser Code gibt ein falsches Ergebnis von 12 zurück, da er die Größe der Reflect.Value-Struktur anstelle der tatsächlichen, in der Schnittstelle gespeicherten Struktur bestimmt .

Lösung

Um dieses Problem zu beheben, verwenden Sie „reflect.Type“ anstelle von „reflect.Value to“. erhalten Sie die Größeninformationen. Der Typ „reflect.Type“ verfügt über eine Size()-Methode, die die Größe des entsprechenden Typs zurückgibt:

size := reflect.TypeOf(T).Size()
Nach dem Login kopieren

Mit diesem Ansatz liefert der Code das korrekte Ergebnis von 40, wobei das Auffüllen innerhalb der Struktur berücksichtigt wird.

Das obige ist der detaillierte Inhalt vonWie kann ich die Größe einer beliebigen Go-Struktur generisch bestimmen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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