首页 > 解决方案 > 无法模仿Golang的错误界面

问题描述

我试图在类似的代码中模仿错误发生的事情,第一段代码打印---日志第二个不为什么呢?或者换句话说,我试图了解如何在没有显式调用的情况下调用 Error() 方法。

package main

import (
    "fmt"
)

type argError struct {
    arg  int
    prob string
}

func (e *argError) Error() string {
    return fmt.Sprintf("%d ---- %s", e.arg, e.prob)
}

func f2(arg int) (int, error) {
        return -1, &argError{arg, "can't work with it"}
}

func main() {
    a,b := f2(42)
    fmt.Println(a)
    fmt.Println(b)
}



package main

import (
    "fmt"
)

type myerr interface {
    Apple() string
}

type dummy struct {
    age  int
    name string
}

func (d *dummy) Apple() string {
    return fmt.Sprintf("%d --- %s", d.age, d.name)
}

func f1(arg int) (string, myerr) {
    return "f1", &dummy{arg, "ret"}
}

func main() {
    i, j := f1(42)
    fmt.Println(i)
    fmt.Println(j)
}

标签: gointerface

解决方案


为了让它工作,你的类型必须error通过一个Error方法来实现接口。我建议将您的myerr界面调整为 embed error,如下所示:

package main

import (
    "fmt"
)

type myerr interface {
    error                    // <--- note: embedding 'error' here
    Apple() string
}

type dummy struct {
    age  int
    name string
}

func (d *dummy) Apple() string {
    return fmt.Sprintf("%d --- %s", d.age, d.name)
}

// <--- note: implement the 'error' interface for the 'dummy' type
func (d *dummy) Error() string {
    return fmt.Sprintf("%d ---- %s", d.age, d.name)
}

func f1(arg int) (string, myerr) {
    return "f1", &dummy{arg, "ret"}
}

func main() {
    i, j := f1(42)
    fmt.Println(i)
    fmt.Println(j)
}

这应该调用你所期望的Error方法。j

您可以在 Go 操场上试一试。


推荐阅读