Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Menentukan Secara Umum Saiz Mana-mana Struktur Go?

Bagaimanakah Saya Boleh Menentukan Secara Umum Saiz Mana-mana Struktur Go?

DDD
DDDasal
2024-11-26 07:58:08908semak imbas

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

Cara Mencipta Fungsi Generik untuk Menentukan Saiz Sebarang Struktur dalam Go

Salah satu tugas yang biasa dilakukan dalam pengaturcaraan ialah menentukan saiz struktur. Dalam Go, ini boleh dicapai menggunakan fungsi tidak selamat.Sizeof. Walau bagaimanapun, mencipta fungsi generik yang boleh mengendalikan sebarang jenis struktur adalah sedikit lebih mencabar.

Isu

Pendekatan biasa untuk mencipta fungsi generik ialah menggunakan antara muka dan refleksi. Walau bagaimanapun, menggunakan pendekatan ini seperti yang ditunjukkan di bawah menghasilkan hasil yang salah:

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

Kod ini mengembalikan hasil 12 yang salah, kerana ia menentukan saiz pantulan. Nilai struct dan bukannya struktur sebenar yang disimpan dalam antara muka .

Penyelesaian

Untuk menyelesaikan isu ini, gunakan reflect.Type instead of reflect.Nilai untuk mendapatkan maklumat saiz. Jenis reflect.Type mempunyai kaedah Saiz() yang mengembalikan saiz jenis yang sepadan:

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

Menggunakan pendekatan ini, kod memberikan hasil 40 yang betul, mengambil kira padding dalam struktur.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menentukan Secara Umum Saiz Mana-mana Struktur Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn