2015-07-10 22 views
5

Tôi đang viết một hàm tổng quát nhận được bất kỳ loại cấu trúc và kích thước trả về nào của cấu trúc đó, tương tự như sizeof chức năng bằng ngôn ngữ C.chức năng chung để lấy kích thước của bất kỳ cấu trúc nào trong golang

Tôi đang cố gắng thực hiện việc này bằng cách sử dụng giao diện và phản chiếu nhưng tôi không thể nhận được kết quả chính xác. Mã bên dưới

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

Mã này trả về kết quả sai là 12. Tôi rất mới để golang, vui lòng giúp tôi về điều này.

Trả lời

8

Bạn đang nhận được kích thước của cấu trúc reflect.Value, không phải của đối tượng có trong giao diện T. May mắn thay, reflect.Type có một phương pháp Size():

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

này mang lại cho tôi 40, có ý nghĩa vì đệm.

+0

cảm ơn. Nó hoạt động tốt – sujin

+4

Ngoài ra, bạn có thể sử dụng 'unsafe.Sizeof (myType {})'. – thwd

+0

@thwd Bạn nói đúng nhưng hàm getSize của tôi phải tìm kích thước của bất kỳ cấu trúc nào, nó phải tìm loại cấu trúc trong suốt thời gian chạy. Bởi vì điều đó tôi đã chọn phản ánh gói – sujin

Các vấn đề liên quan