Rumah >pembangunan bahagian belakang >Golang >Apakah cara yang betul untuk menukar fungsi Go kepada uintptr?

Apakah cara yang betul untuk menukar fungsi Go kepada uintptr?

王林
王林ke hadapan
2024-02-09 13:10:081164semak imbas

将 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))
}

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))
}
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!

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