第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

errno to Go 錯誤

errno to Go 錯誤

Go
森林海 2022-09-19 15:04:48
我正在嘗試從 Go 代碼中發(fā)出 KVM 圖標。目前我有如下內(nèi)容:func (vm *Vm) RegisterIrqFd(efd *EventFd, gsi uint32) error {    irqfd := (*C.struct_kvm_irqfd)(C.calloc(1, C.sizeof_struct_kvm_irqfd))    defer C.free(unsafe.Pointer(irqfd))    irqfd.fd = C.uint(efd.Fd())    irqfd.gsi = C.uint(gsi)    if _, err := sysutils.Ioctl(vm.Fd(), C.KVM_IRQFD, uintptr(unsafe.Pointer(irqfd))); err != nil {        return fmt.Errorf("RegisterIrqFd failed: %v", err)    }    return nil}Ioctl 函數(shù)的實現(xiàn)方式如下:func Ioctl(fd uintptr, cmd C.uint, arg uintptr) (uintptr, error) {    ret, _, errno := syscall.Syscall(        syscall.SYS_IOCTL,        fd,        uintptr(cmd),        uintptr(arg),    )    if int64(ret) == -1 {        return ret, ErrnoToErr(errno)    }    return ret, nil}而埃爾諾托爾函數(shù)的實現(xiàn)方式如下:func ErrnoToErr(errno syscall.Errno) error {    return fmt.Errorf("%v", errno.Error())}在內(nèi)部 獲得支持的處理器,ioctl的參數(shù),是使用 分配的。如果這是C代碼,則可以在堆棧上分配代碼。有什么辦法可以繞過使用caloc和免費使用分配嗎?有什么替代方案會更習(xí)慣嗎?cpuidC.calloccpuid有沒有辦法讓埃雷諾托埃爾返回一個與埃雷諾對應(yīng)的 go 錯誤類型?目前它使用內(nèi)部系統(tǒng)調(diào)用/syscall_unix.go;因此,它只是取消引用字符串列表并返回字符串。最好有一個類型,這樣我就可以測試單元測試中的特定錯誤。(e Errno) Error()
查看完整描述

2 回答

?
當年話下

TA貢獻1890條經(jīng)驗 獲得超9個贊

只需回復(fù)更新后的示例,我們就可以這樣做:


func (vm *Vm) RegisterIrqFd(efd *EventFd, gsi uint32) error {

    irqfd := C.struct_kvm_irqfd{}

    irqfd.fd = C.uint(efd.Fd())

    irqfd.gsi = C.uint(gsi)

    if _, err := sysutils.Ioctl(vm.Fd(), C.KVM_IRQFD, uintptr(unsafe.Pointer(&irqfd))); err != nil {

        return fmt.Errorf("RegisterIrqFd failed: %v", err)

    }

    return nil

}

我認為這是安全的,但無論如何,我們可能會發(fā)現(xiàn),因為我們把它的地址帶到這里,在這種情況下,沒有太多的節(jié)省。即便如此,只要這不違反Go指針規(guī)則(我不認為它確實如此),閱讀起來會好得多。irqfd escapes to heap


查看完整回答
反對 回復(fù) 2022-09-19
?
揚帆大魚

TA貢獻1799條經(jīng)驗 獲得超9個贊

閱讀文檔系統(tǒng)調(diào)用。埃爾諾

因此轉(zhuǎn)換可以像這樣執(zhí)行

func ErrnoToErr(errno syscall.Errno) error {

    if errno != 0 {

        return errno

    }

    return nil

}

對于平等,它只聲明

可以使用 errors.Is 根據(jù) os 包中的錯誤值測試 Errno 值。

比較錯誤的問題已經(jīng)在這里考慮如何比較Go錯誤


查看完整回答
反對 回復(fù) 2022-09-19
  • 2 回答
  • 0 關(guān)注
  • 99 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號