簡體   English   中英

如何使用Golang的反射實例化nil錯誤?

[英]How can I instantiate a nil error using Golang's reflect?

我正在使用reflect.MakeFunc編寫函數。 該函數可以返回錯誤。 成功時,我希望它為錯誤類型的返回值返回nil。 我該如何使用反射? 目前我有這個:

package main

import (
    "fmt"
    "reflect"
    "errors"        
)

func main() {
    fmt.Println("Hello, playground")
    f := func() error {return nil}
    fn := reflect.MakeFunc(reflect.TypeOf(f), func(args []reflect.Value) []reflect.Value {
        return []reflect.Value{reflect.New(reflect.TypeOf(errors.New("")))}
    }).Interface().(func() error)
    fmt.Printf("err: %v", fn())
}

我感到panic: reflect: function created by MakeFunc using closure returned wrong type: have **errors.errorString for error 我也試過在reflect.New(reflect.TypeOf(errors.New(""))) .Elem()之后添加一個.Elem() ,但我感到panic: reflect: function created by MakeFunc using closure returned wrong type: have *errors.errorString for error 我嘗試了.Elem().Elem() ,但出現了段錯誤。

如何獲得表示nil錯誤的reflect.Value?

我找到了一種方法reflect.ValueOf(f).Call(nil) 也許有更好的選擇。

使用以下內容:

var nilError = reflect.Zero(reflect.TypeOf((*error)(nil)).Elem())

func main() {
    fmt.Println("Hello, playground")
    f := func() error { return nil }
    fn := reflect.MakeFunc(reflect.TypeOf(f), func(args []reflect.Value) []reflect.Value {
        return []reflect.Value{nilError}
    }).Interface().(func() error)
    fmt.Printf("err: %v", fn())
}

讓我們分解一下。 第一步是獲取errorreflect.Typereflect.TypeOf((*error)(nil)).Elem() 更簡單的reflect.TypeOf((error)(nil))不起作用,因為參數的具體值為nil 沒有nil的類型,這也不是我們想要的類型。 解決方法是傳遞一個指向error的指針,然后對該類型調用Elem()以獲取errorrelfect.Type

第二步是為類型創建一個零值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM