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.
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)) }
Saya mencari di internet tetapi maklumat ini tidak dapat dilihat secara langsung dalam google.
Terima kasih.
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)) }
3 3 Process finished with the exit code 0
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!