go generate:stringer:invalid operation:没有字段或方法String

时间:2015-03-01 11:15:43

标签: go

我正在尝试使用stringer cmd,以便为某些int类型生成String()方法。代码如下所示

//go:generate stringer -type=MyIntType
type MyIntType int

const (
    resource MyIntType = iota
)
func myfunc(){
print(resource.String())
}

我正在进行的错误生成命令是invalid operation: resource (constant 0 of type MyIntType) has no field or method String,这是有道理的,因为还没有String方法。如果stringer cmd应该实际生成String方法,我该如何修复此错误?我应该在整个代码中使用fmt.Sprintf(“%s”,资源)吗?它对我来说有点难看。至少不如resource.String()。

2 个答案:

答案 0 :(得分:0)

在生成方法之前,必须解析每个文件并由types库进行类型检查。这通常不会造成问题,因为String()方法很少直接调用,并且通过将值传递给类似fmt.Println的值来使用,该值始终首先检查Stringer

您可以自己致电String()

file:type.go

//go:generate stringer -type=MyIntType
package painkiller

import "fmt"

type MyIntType int

const (
    resource MyIntType = iota
)

func myfunc() {
    fmt.Println(resource)
}

或者您可以将调用放在另一个文件中,并仅传递stringer需要的文件作为参数。没有参数,stringer会检查整个包,但如果只提供一个文件列表,他们会假设某些方法可能在未提供的文件中定义。

file:type.go

//go:generate stringer -type=MyIntType type.go
package foo

type MyIntType int

const (
    resource MyIntType = iota
)

档案myfunc.go

package foo

func myfunc() {
    print(resource.String())
}

答案 1 :(得分:0)

stringer cmd为每个go文件调用go / parser.ParseFile。因此,如果您有一个未声明的方法,它将失败。您将不得不使用fmt.Sprint *语句来克服这个问题。或者你可以告诉go generate只生成一个特定的文件。

我不知道我们是否可以将此称为错误。你可以提交它,可能会看到响应是什么。