Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah Saya Boleh Mendapatkan Saiz Mana-mana Struktur dalam Go Menggunakan Refleksi?

Bagaimanakah Saya Boleh Mendapatkan Saiz Mana-mana Struktur dalam Go Menggunakan Refleksi?

Mary-Kate Olsen
Lepaskan: 2024-11-28 01:40:14
asal
555 orang telah melayarinya

How Can I Get the Size of Any Structure in Go Using Reflection?

Fungsi Generik untuk Mendapatkan Saiz Sebarang Struktur dalam Go

Masalah:
Matlamatnya adalah untuk mencipta fungsi generik dalam Go yang boleh menentukan saiz mana-mana struktur sewenang-wenangnya, sama dengan saiz fungsi dalam C.

Kod dan Ralat:
Kod yang disediakan menggunakan pantulan untuk mendapatkan semula saiz struktur. Walau bagaimanapun, refleksi pada reflect.Value struct, bukannya mencerminkan pada objek, menghasilkan keputusan yang salah. Berikut ialah kod yang dipersoalkan:

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) // Prints 12, which is incorrect
}
Salin selepas log masuk

Penyelesaian:
Untuk menyelesaikan isu ini, seseorang perlu memikirkan jenis dan bukannya nilai objek. Reflection.Type mempunyai kaedah Size() yang menyediakan saiz yang betul. Berikut ialah kod yang dikemas kini:

package main

import (
    "fmt"
    "reflect"
)

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)
    size := v.Type().Size()
    fmt.Println(size) // Prints 40, which is correct
}
Salin selepas log masuk

Penjelasan:
Kod yang diperbetulkan menggunakan kaedah Saiz() bagi pantulan.Jenis, yang mengembalikan saiz struktur tanpa overhed daripada pantulan .

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

Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan