Golang函数返回参数过多问题:实际返回(error)但期望返回()
Golang函数返回参数过多问题:实际返回(error)但期望返回() 我正在使用托管在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
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")
}
问题在于你的函数签名没有声明返回错误类型。当函数声明为 func() {...}(无返回值)时,你不能使用 return err,因为 err 是 error 类型,而函数期望返回零个值。
你需要修改函数签名以包含 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)
}
}



