Cgo结构类型的形式为_Ctype_struct_
似乎对gotype
来说是未知的。
你正在使用哪个版本的Go(go version
)?
go version go1.10.2 linux/amd64
这个问题在最新版本中是否会重现?
是的
你正在使用什么操作系统和处理器架构(go env
)?
GOARCH="amd64"
GOOS="linux"
GCCGO="gccgo"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
你做了什么?
使用gotype
对一个导入github.com/google/gopacket/pcap
的虚拟包进行lint检查。$ go get -u github.com/google/gopacket/pcap
$ cat $GOPATH/src/github.com/google/dummy/dummy.go
package dummy
import _ "github.com/google/gopacket/pcap"
$ gotype dummy.go
你期望看到什么?
没有输出(一切都正常)。
你看到了什么?
dummy.go:2:10: could not import github.com/google/gopacket/pcap (type-checking package "github.com/google/gopacket/pcap" failed ($GOPATH/src/github.com/google/gopacket/pcap/pcap.go:533:49: undeclared name: _Ctype_struct_bpf_program))
直接在gotype
上运行得到:
$ gotype pcap.go
pcap.go:533:49: undeclared name: _Ctype_struct_bpf_program
pcap.go:203:7: undeclared name: _Ctype_struct_bpf_program
pcap.go:661:66: undeclared name: _Ctype_struct_bpf_program
pcap.go:801:34: undeclared name: _Ctype_struct_pcap_addr
pcap.go:401:17: invalid operation: p.pkthdr (variable of type *invalid type) has no field or method ts
pcap.go:403:19: invalid operation: p.pkthdr (variable of type *invalid type) has no field or method ts
pcap.go:406:27: invalid operation: p.pkthdr (variable of type *invalid type) has no field or method caplen
pcap.go:407:20: invalid operation: p.pkthdr (variable of type *invalid type) has no field or method len
pcap.go:425:4: invalid operation: p (variable of type *Handle) has no field or method waitForPacket
pcap.go:488:13: undeclared name: _Ctype_struct_pcap_stat
2条答案
按热度按时间93ze6v8z1#
(CC: @alandonovan@griesemer )
yxyvkwin2#
go/types 并不了解 C;它只知道它所呈现的
.go
文件(或包)。由于 go/types 不是通过 go 命令运行的,因此不会运行 cgo,它也看不到 cgo 生成的文件(其中包含相关定义)。当 go/types 看到一个
import "C"
时,它会“伪造”这个导入,并静默地抑制所有形式为C.foo
的限定标识符产生的错误。因此,它对于C.foo
风格的标识符“工作”得还可以。没有简单的解决方法。