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")
}