我正在尝试使用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()。
答案 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只生成一个特定的文件。
我不知道我们是否可以将此称为错误。你可以提交它,可能会看到响应是什么。