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
479 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!

sumber:php.cn
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