Go 无法使用错误。返回参数中的类型错误为New(“something error”)(类型错误)
我有以下代码()。它在操场上工作,但在我的系统上失败Go 无法使用错误。返回参数中的类型错误为New(“something error”)(类型错误),go,Go,我有以下代码()。它在操场上工作,但在我的系统上失败 package main import ( "log" "errors" ) func main() { j := &JustForTest{} a, err := j.Test(3) if err != nil { log.Println(err) } log.Println(a) } type JustForTest struct {} func (j
package main
import (
"log"
"errors"
)
func main() {
j := &JustForTest{}
a, err := j.Test(3)
if err != nil {
log.Println(err)
}
log.Println(a)
}
type JustForTest struct {}
func (j *JustForTest) Test(i int) (string, error) {
if i < 5 {
return "fail", errors.New("something wrong")
}
return "success", nil
}
但是,当我在系统上运行“go install”时,会出现编译器错误:
../warehouse/warehouse.go:32: cannot convert nil to type error
../warehouse/warehouse.go:83: cannot use errors.New("something wrong") (type error) as type error in return argument
../warehouse/warehouse.go:85: cannot use nil as type error in return argument
我觉得这真的很奇怪。我已将Go安装从1.3.2升级到1.3.3,但仍然出现相同的错误。我的系统可能有什么问题
更新:
这是我的本地代码:
package warehouse
import (
"net/http"
"path"
"log"
"errors"
)
func Route(w http.ResponseWriter, r *http.Request) {
uri := path.Dir(r.URL.Path)
base := path.Base(r.URL.Path)
if uri == "/" || (uri == "/products" && base != "products") {
uri = path.Join(uri, base)
}
// initiate all types
warehouse := Warehouse{}
inventory := Inventory{}
// check the request method
if r.Method == "GET" {
switch uri {
case "/warehouse":
j := &JustForTest{} // This is the troubled code
a, err := j.Test(3)
if err != nil {
log.Println(err)
}
log.Println(a)
...
}
}
type JustForTest struct {}
func (j *JustForTest) Test(i int) (string, error) {
if i < 5 {
return "fail", errors.New("something wrong")
}
return "success", nil
}
包装仓库
进口(
“net/http”
“路径”
“日志”
“错误”
)
func路由(w http.ResponseWriter,r*http.Request){
uri:=path.Dir(r.URL.path)
base:=path.base(r.URL.path)
如果uri=“/”| |(uri=“/products”&&base!=“products”){
uri=path.Join(uri,基)
}
//启动所有类型
仓库:=仓库{}
存货:=存货{}
//检查请求方法
如果r.Method==“GET”{
开关uri{
案例“/仓库”:
j:=&JustForTest{}//这是有问题的代码
a、 错误:=j.测试(3)
如果错误!=零{
log.Println(错误)
}
log.Println(a)
...
}
}
类型JustForTest结构{}
func(j*JustForTest)测试(i int)(字符串,错误){
如果我<5{
返回“fail”,errors.New(“出错”)
}
返回“成功”,无
}
我发现当我运行这段代码时,我得到了一个错误。但是当我编写一个新的包,并且只编写与我在plaground中所做的完全相同的代码时,它工作了。我不明白为什么会发生这种情况。有什么建议吗?看起来你已经在包中定义了一个名为
error
的类型
这会导致与内置error
类型的名称冲突(您的包定义的类型会遮挡内置类型),因此会出现令人困惑的错误消息
为包的类型使用不同的、更具描述性(不太通用)的名称。除了@tomwide response,我建议使用函数生成错误。您还需要添加“fmt”包的导入,并可以删除“errors”包的导入 您的代码可以从以下位置更改:
if i < 5 {
return "fail", errors.New("something wrong")
}
如果i<5{
返回“fail”,errors.New(“出错”)
}
致:
如果i<5{
返回“fail”,fmt.Errorf(“出错”)
}
使用fmt.Errorf()
方法的优点是,您还可以提供格式来生成错误消息,这在将来可能非常方便,例如fmt.Errorf(“一些错误…%#v”,aValue)
我希望这会有所帮助。您在本地测试的代码显然与您发布的代码不同。您在示例中没有出现的行上出现错误。仍然不是您的代码。未编译,仓库和库存在哪里?没有第85行。问题似乎出在Warehouse.go文件中,而不是这里。@siritinga我同意您的意见,所以我的软件包(其他文件)中的方法只是影响了类型错误的工作方式。我发现Tomwide先生的答案是我的解决方案。无论如何,感谢您提供的线索使用
返回“fail”,fmt.Errorf(“出错”)
而不是返回“fail”,errors.New(“出错”)
。您必须导入“fmt”并删除“errors”package.nice catch dude.这正是我头疼的原因。你是对的,我在两周前的代码中定义了一个新的错误类型,遗憾的是我真的忘记了。它显然覆盖了go的默认错误类型。现在我找到了它。它解决了。非常感谢:)很好。这对我很有用,因为我已经导入并使用fmt:)。thanks
if i < 5 {
return "fail", errors.New("something wrong")
}
if i < 5 {
return "fail", fmt.Errorf("something wrong")
}