Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Pergi melaporkan doktor haiwan "Kemungkinan penyalahgunaan reflect.SliceHeader"

Pergi melaporkan doktor haiwan "Kemungkinan penyalahgunaan reflect.SliceHeader"

WBOY
WBOYke hadapan
2024-02-11 12:09:241030semak imbas

Go vet 报告“可能滥用reflect.SliceHeader”

Editor PHP Zimo membawakan anda berita tentang laporan doktor haiwan Go hari ini. Baru-baru ini, pegawai bahasa Go mengeluarkan amaran yang menyatakan bahawa mungkin terdapat penyalahgunaan reflect.SliceHeader. Go vet ialah alat analisis statik dalam bahasa Go, digunakan untuk menyemak ralat biasa dan kemungkinan masalah dalam kod. Laporan itu menasihatkan pembangun supaya berhati-hati apabila menggunakan reflect.SliceHeader untuk mengelakkan masalah yang mungkin berlaku. Dalam artikel ini, kami akan menerangkan masalah ini secara terperinci dan memberikan penyelesaian yang sepadan.

Kandungan soalan

Saya mempunyai coretan kod berikut dan "pergi doktor haiwan" mengadu tentang amaran "Kemungkinan penyalahgunaan reflect.sliceheader". Saya tidak dapat mencari maklumat lanjut tentang amaran ini selain daripada ini. Selepas membaca ini saya tidak pasti apa yang perlu dilakukan untuk membuat pergi doktor haiwan gembira - dan tidak mempunyai masalah gc yang mungkin.

Matlamat coretan kod ini adalah untuk membolehkan fungsi go menyalin data ke dalam memori yang diuruskan oleh perpustakaan c legap. Fungsi go memerlukan []bait sebagai parameter.

func Callback(ptr unsafe.Pointer, buffer unsafe.Pointer, size C.longlong) C.longlong {
        ...
        sh := &reflect.SliceHeader{
                Data: uintptr(buffer),
                Len:  int(size),
                Cap:  int(size),
        }
        buf := *(*[]byte)(unsafe.Pointer(sh))
        err := CopyToSlice(buf)
        if err != nil {
           log.Fatal("failed to copy to slice")
        }
        ...
}

Penyelesaian

Nampaknya jimb (daripada komen) membayangkan jawapan yang paling betul, walaupun dia tidak menyiarkannya sebagai jawapan atau menyertakan contoh. Yang berikut lulus doktor haiwan, staticcheck dan golangci-lint - dan tidak segfault, jadi saya fikir ini adalah jawapan yang betul.

func Callback(ptr unsafe.Pointer, buffer unsafe.Pointer, size C.longlong) C.longlong {
        ...
        buf := unsafe.Slice((*byte)(buffer), size)
        err := CopyToSlice(buf)
        if err != nil {
           log.Fatal("failed to copy to slice")
        }
        ...
}

Atas ialah kandungan terperinci Pergi melaporkan doktor haiwan "Kemungkinan penyalahgunaan reflect.SliceHeader". Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam