go - 为什么在这个例子中我们返回一个指针而不是一个值?
问题描述
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 ) 代替?或者为什么在这种情况下我们返回指针而不是值?
解决方案
error 是一个要求有Error() string
方法的接口。
这里的问题是您Error() string
在指针上声明了该方法。func (e *argError) Error() string
,因此只有一个*argError
实现了一个error
,而不是一个argError
。所以你只能返回一个&argError{...}
.
你应该知道*error
和error
指针是不同的。前者是指向interface
持有任何具体类型的指针,后者是interface
持有指针。
在实践中,由于 aninterface
是关于方法的,指向 an 的指针interface
很少有用,而interface
持有指针则被广泛使用。
推荐阅读
- css - (Laravel Mix - 复制目录) - 从scss,less复制到css后如何编译样式文件
- canvas - Canvas API 从路径的最新点断开弧
- oracle - AWS DMS 与 CDC。更新记录只包含更新的字段。如何包括所有?
- python - 如何根据使用 pyhton 的数据框中的值获取函数的公式
- python - 如何过滤数据框中的行?
- c# - ASP.NET Core 从显式文化中获取资源字符串
- c# - Visual Studios 解决方案资源管理器中项目文件图标的差异
- git - 如何在 Github-Pages 下访问 Github Wiki 页面
- docker - 有没有办法在 kubernetes 中配置 docker hub pro 用户?
- javascript - 如何将错误记录到 Firebase Cloud Functions Log?