Apakah cara yang betul untuk menukar fungsi Go kepada uintptr?

王林
Lepaskan: 2024-02-09 13:10:08
ke hadapan
1119 orang telah melayarinya

将 Go func 转换为 uintptr 的正确方法是什么?

Dalam bahasa Go, menukar jenis `func` kepada jenis `uintptr` ialah operasi biasa, tetapi kaedah yang betul bukanlah untuk menukar secara langsung, kerana ini mungkin menyebabkan beberapa masalah yang mungkin berlaku. Cara yang betul ialah menggunakan fungsi `Penunjuk` dalam pakej `tidak selamat` untuk menukar nilai jenis `func` kepada jenis `unsafe.Pointer` dahulu, dan kemudian menukarnya kepada jenis `uintptr`. Ini memastikan keselamatan penukaran jenis dan mengelakkan ralat yang tidak dapat diramalkan. Walaupun kaedah ini memerlukan penggunaan pakej `tidak selamat`, dalam keadaan yang betul, kaedah ini boleh menyelesaikan masalah menukar `Go func` kepada `uintptr` dengan berkesan.

Kandungan soalan

Saya perlu lulus dan menerima fungsi go dalam kod go.

Disebabkan cara panggilan sistem berfungsi dalam bahasa go, jenis yang digunakan untuk "laluan" ialah uintptr.

Saya tiada pilihan selain uintptr 之外我别无选择,因为 syscall.syscalln kerana syscall.syscalln menerima dan mengembalikan jenis ini.

Apakah cara yang betul untuk menukar go func kepada func 转换为 uintptr ?

Saya cuba menggunakannya dalam kotak pasir tetapi saya tidak boleh menukarnya dengan mudah.

package main

import (
    "fmt"
    "unsafe"
)

func main() {
    var f MyFunc = SumInt
    fmt.Println(f(1, 2))
    test(uintptr(f))                 // Cannot convert an expression of the type 'MyFunc' to the type 'uintptr'
    test(uintptr(unsafe.Pointer(f))) // Cannot convert an expression of the type 'MyFunc' to the type 'unsafe.Pointer'
}

type MyFunc func(a int, b int) (sum int)

func SumInt(a, b int) int {
    return a + b
}

func test(x uintptr) {
    var xf MyFunc
    xf = MyFunc(x)                 // Cannot convert an expression of the type 'uintptr' to the type 'MyFunc'
    xf = MyFunc(unsafe.Pointer(x)) // Cannot convert an expression of the type 'unsafe.Pointer' to the type 'MyFunc'
    fmt.Println(xf(1, 2))
}
Salin selepas log masuk

Saya mencari di internet tetapi maklumat ini tidak dapat dilihat secara langsung dalam google.

Terima kasih.

Penyelesaian

Saya jumpa penyelesaian! Saya perlu lulus penunjuk fungsi.

package main

import (
    "fmt"
    "unsafe"
)

func main() {
    var f myfunc = sumint
    fmt.println(f(1, 2))
    test(uintptr(unsafe.pointer(&f)))
}

type myfunc func(a int, b int) (sum int)

func sumint(a, b int) int {
    return a + b
}

func test(x uintptr) {
    var xfp *myfunc
    xfp = (*myfunc)(unsafe.pointer(x))

    var xf myfunc
    xf = *xfp
    fmt.println(xf(1, 2))
}
Salin selepas log masuk
3
3

Process finished with the exit code 0
Salin selepas log masuk

Atas ialah kandungan terperinci Apakah cara yang betul untuk menukar fungsi Go kepada uintptr?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:stackoverflow.com
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!