Golang函数返回参数过多问题:实际返回(error)但期望返回()

Golang函数返回参数过多问题:实际返回(error)但期望返回() 我正在使用托管在GitHub上的验证库…

GitHub GitHub - santhosh-tekuri/jsonschema

JSONSchema (draft04, draft06, draft07) Validation using Go - santhosh-tekuri/jsonschema

在main函数中,我写了以下代码来验证库

schema, err := jsonschema.Compile("schemas/purchaseOrder.json")
if err != nil {
return err
}
f, err := os.Open("purchaseOrder.json")
if err != nil {
return err
}
defer f.Close()
if err = schema.Validate(f); err != nil {
return err
}

如果我尝试返回发生的验证异常,它会抛出如下异常:

.\validation.go:12:2: too many arguments to return
have (error)
want ()
.\validation.go:16:3: too many arguments to return
have (error)
want ()
.\validation.go:20:3: too many arguments to return
have (error)
want ()

对于每个错误返回,它都会抛出异常。 但我只想使用 return err,不想使用 panic。 我是编程新手。 有什么建议可以解决这个问题吗?


更多关于Golang函数返回参数过多问题:实际返回(error)但期望返回()的实战教程也可以访问 https://www.itying.com/category-94-b0.html

7 回复

validation.go 是你的文件还是库的一部分?第12、16和20行具体是什么内容?

更多关于Golang函数返回参数过多问题:实际返回(error)但期望返回()的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我可以使用它,但如果想要打印异常信息,该如何操作?

你不能从 main 函数中返回错误。记录它并退出。

这与 JSON 库无关。

你可以使用 fmt.Println() 或类似的函数。

func main() {
    fmt.Println("hello world")
}

我通常使用另一个函数来完成实际工作。示例:

https://play.golang.org/p/HIHuEjBkL83

祝你好运!

Capture

这只是文件

问题在于你的函数签名没有声明返回错误类型。当函数声明为 func() {...}(无返回值)时,你不能使用 return err,因为 errerror 类型,而函数期望返回零个值。

你需要修改函数签名以包含 error 作为返回值。以下是修正后的代码示例:

func validateOrder() error { // 注意这里添加了 error 返回值
    schema, err := jsonschema.Compile("schemas/purchaseOrder.json")
    if err != nil {
        return err // 现在这是有效的
    }
    
    f, err := os.Open("purchaseOrder.json")
    if err != nil {
        return err // 现在这是有效的
    }
    defer f.Close()
    
    if err = schema.Validate(f); err != nil {
        return err // 现在这是有效的
    }
    
    return nil // 验证成功时返回 nil
}

如果你的函数是 main 函数,可以这样处理:

func main() {
    if err := validateOrder(); err != nil {
        // 处理错误,例如打印并退出
        fmt.Fprintf(os.Stderr, "Validation failed: %v\n", err)
        os.Exit(1)
    }
    // 验证成功,继续执行...
}

或者直接在 main 函数中返回错误(Go 1.19+):

func main() error {
    schema, err := jsonschema.Compile("schemas/purchaseOrder.json")
    if err != nil {
        return err
    }
    
    f, err := os.Open("purchaseOrder.json")
    if err != nil {
        return err
    }
    defer f.Close()
    
    return schema.Validate(f)
}

然后在真正的 main 包中:

package main

import (
    "fmt"
    "os"
)

func realMain() error {
    // ... 你的验证代码
}

func main() {
    if err := realMain(); err != nil {
        fmt.Fprintf(os.Stderr, "Error: %v\n", err)
        os.Exit(1)
    }
}
回到顶部