登录
首页 >  Golang >  Go问答

为什么在这个例子中我们返回一个指针而不是一个值?

来源:stackoverflow

时间:2024-04-27 13:24:56 261浏览 收藏

今天golang学习网给大家带来了《为什么在这个例子中我们返回一个指针而不是一个值?》,其中涉及到的知识点包括等等,无论你是小白还是老手,都适合看一看哦~有好的建议也欢迎大家在评论留言,若是看完有所收获,也希望大家能多多点赞支持呀!一起加油学习~

问题内容

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... 作为返回值,但方法声明为返回 error。为什么f2签名没有定义为

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


解决方案


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

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

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

实际上,由于 interface 都是关于方法的,因此指向 interface 的指针很少有用,而持有指针的 interface 则被广泛使用。

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>