我正在尝试使用go generate / stringer(golang.org/x/tools/cmd/stringer
)在枚举上生成String()方法。我有些问题,我认为是因为不同系统上的.a软件包格式略有不同。我有这个文件:
package main
import (
"math/rand"
)
//go:generate stringer -type=Foo
type Foo int;
const (
FooPrime Foo = iota
FooBis
)
func main() {
//Just use rand anywhere, otherwise we get a compiler error
rand.Seed(1)
}
现在,如果我在我的机器上运行go generate example.go,一切都很好:创建了foo_string.go。但是,在测试机上,我得到了:
stringer: checking package: example.go:4:2: could not import math/rand (reading export data: /usr/lib64/go/pkg/linux_amd64/math/rand.a: go archive is missing __.PKGDEF)
现在,在对代码进行一些挖掘后,我认为我得到了这个错误,因为在我的机器上rand.a有以下标题:
!<arch>
__.PKGDEF 0 0 0 644 2051
` 在测试机器上它有以下标题:
!<arch>
__.PKGDEF/ 0 399 399 100644 2051
`
我认为关键的区别是PKGDEFF之后的斜线。 gcimporter拒绝处理.a文件,如果它没有__。PKGDEF标题。
为了检查这一点,我手动编辑了gcimporter / exportdata.go并更改了其中一行:
if name != "__.PKGDEF"
到此:
if name != "__.PKGDEF" && name != "__.PKGDEF\"
在此更改(以及编译和安装所有内容)之后,我能够在example.go上运行go generate。
我的问题是:为什么我会遇到这个问题,如何摆脱它(除了手动编辑外部库)?