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
DDDOriginal
2024-11-26 07:58:08901Durchsuche

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)
}

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()

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!

Stellungnahme:
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