首页 > 解决方案 > 为什么在这个例子中我们返回一个指针而不是一个值?

问题描述

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() {

    _, e := f2(42)
    if ae, ok := e.(*argError); ok {
        fmt.Println(ae.arg)
        fmt.Println(ae.prob)
    }
}

在 f2 我们有指针&argError...作为返回值,但方法声明返回错误。为什么 f2 签名未定义为

func f2(arg int) (int, *error ) 代替?或者为什么在这种情况下我们返回指针而不是值?

标签: go

解决方案


error 是一个要求有Error() string方法的接口。

这里的问题是您Error() string在指针上声明了该方法。func (e *argError) Error() string,因此只有一个*argError实现了一个error,而不是一个argError。所以你只能返回一个&argError{...}.

你应该知道*errorerror指针是不同的。前者是指向interface持有任何具体类型的指针,后者是interface持有指针。

在实践中,由于 aninterface是关于方法的,指向 an 的指针interface很少有用,而interface持有指针则被广泛使用。


推荐阅读