在此示例中,为什么我们返回一个指针而不是一个值?

萨克斯:
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 ...作为返回值,但声明为return error的方法为什么未将f2签名定义为

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

叶蜂

错误是要求具有Error() string方法的接口

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

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

实际上,由于an interface与方法有关,因此在广泛使用保持指针的interface同时,指向an的指针很少有用interface

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么我们需要在React Hook中返回一个函数?

为什么我们添加一个值以在程序集中初始化堆栈指针(R7)?

为什么地板在此示例中返回少了一个元素

当我们在微任务队列中返回一个值并从 then() 链返回一个 Promise.resolve 时会发生什么?

为什么我们需要一个“MultiRepositoryProvider”和一个单独的“MultiBlocProvider”?

为什么只有我们尝试添加的最后一个值重复存储在arraylist中

Scala集合:为什么我们需要一个case语句来提取高阶函数中的值元组?

为什么我们需要一个接口来定义aem中的每个服务?

为什么我们需要在堆中创建一个对象?

为什么我们在 main 函数中启动一个对象

为什么我们在主体是一个return语句时使用if,else if而不是多个if块

如果我们从函数构造函数创建一个名为“ a”的对象,那么为什么“ a”不是Function的实例?

为什么我们必须创建一个新对象“输入”而不是直接使用 Scanner.nextLine() ?

为什么在C ++ 11中,我们从vector :: resize中的一个函数移至2个版本?

在 SLL 中,当其原始节点属性默认设置为 None 时,为什么我们显式覆盖指向 None 的下一个指针?

为什么我们需要两个接口来枚举一个集合?

为什么我们创建一个变量来引用一个类而不是仅仅使用document.querySelector(“。class”)?

为什么下面的`std :: transform`示例需要一个函数指针而不是一个函数对象?

为什么我的代码给我一个值而不是一个列表

我们可以在类声明中声明一个类类型的指针吗?

为什么我们要指定一个委托和一个事件,为什么不只在C#中使用一个事件呢?

当我们有一个红色区域时,为什么我们需要堆栈分配?

为什么我们在那里使用一个monoid和一个函子?

为什么“ a-> content”给我一个地址而不是一个值?

了解 Xcode 中的 .xcconfig 文件,我们为什么要使用它。我看到一个用于调试,一个用于发布。

为什么Swift Playground中的map(_ :)返回一个String而不是一个元组?

为什么在字典中,当我们有相同的值和不同的键名时,为什么它会选择一个与另一个相比

为什么对于equals方法我们需要一个Object参数?

为什么我们必须从一个小部件更新多个小部件?