2015-07-10 10 views
5

Piszę ogólną funkcję, która ma dowolny typ struktury i wielkość zwrotu tej struktury, podobną do sizeof funkcji w języku C.Ogólna funkcja, aby uzyskać rozmiar dowolnej struktury w golang

Próbuję zrobić to za pomocą interfejsu i refleksji, ale nie jestem w stanie uzyskać prawidłowego wyniku. Kod jest poniżej

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

Ten kod zwraca błędny wynik jako 12. Jestem bardzo nowy w golangu, proszę mi pomóc w tej sprawie.

Odpowiedz

8

Otrzymujesz rozmiar struktury reflect.Value, a nie obiektu zawartego w interfejsie T. Na szczęście reflect.Type ma Size() metody:

size := reflect.TypeOf(T).Size() 

To daje mi 40, który ma sens z powodu wypełnienia.

+0

dzięki. Udało się dobrze – sujin

+4

Alternatywnie możesz użyć 'unsafe.Sizeof (myType {})'. – thwd

+0

@thwd Masz rację, ale moja funkcja getSize musi znaleźć rozmiar dowolnej struktury, musi znaleźć typ struktury podczas działania. Z tego powodu wybrałem pakiet odzwierciedlający – sujin

Powiązane problemy