当前位置: > > > > 为什么在这个例子中我们返回一个指针而不是一个值?
为什么在这个例子中我们返回一个指针而不是一个值?
来源:stackoverflow
2024-04-27 13:24:56
0浏览
收藏
今天米云给大家带来了《为什么在这个例子中我们返回一个指针而不是一个值?》,其中涉及到的知识点包括等等,无论你是小白还是老手,都适合看一看哦~有好的建议也欢迎大家在评论留言,若是看完有所收获,也希望大家能多多点赞支持呀!一起加油学习~
问题内容
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{...}。
您应该知道指针的 *error 和 error 是不同的。前者是指向持有任何具体类型的 interface 的指针,后者是持有指针的 interface 。
实际上,由于 interface 都是关于方法的,因此指向 interface 的指针很少有用,而持有指针的 interface 则被广泛使用。
今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注米云公众号,一起学习编程~
