我正在尝试重新打包一些与现有C库集成的Go代码。
以下内容完美地运行。
文件1:
package avcodec
type Codec C.struct_AVCodec
文件2:
package avformat
//#cgo pkg-config: libavformat libavcodec
//#include <libavformat/avformat.h>
//#include <libavcodec/avcodec.h>
import "C"
import (
"unsafe"
)
type Codec C.struct_AVCodec
func (s *FormatContext) AvFormatGetVideoCodec() *Codec {
result := C.av_format_get_video_codec((*C.struct_AVFormatContext)(s))
return (*Codec)(result) // <- This works. Codec is defined in this package.
}
如果我试图将来自文件2的Codec引用或移动到一个单独的包中(例如文件1),我会收到以下错误信息: 无法将(func literal)((*C.struct_AVFormatContext)(s)) (type *C.struct_AVCodec)转换为类型*Codec 例如,以下操作将失败:
package avformat
//#cgo pkg-config: libavformat libavcodec
//#include <libavformat/avformat.h>
//#include <libavcodec/avcodec.h>
import "C"
import (
"avcodec"
"unsafe"
)
func (s *FormatContext) AvFormatGetVideoCodec() *avcodec.Codec {
result := C.av_format_get_video_codec((*C.struct_AVFormatContext)(s))
return (*avcodec.Codec)(result) // <- This fails. Codec defined in avcodec.
}
这也失败了:
package avformat
//#cgo pkg-config: libavformat libavcodec
//#include <libavformat/avformat.h>
//#include <libavcodec/avcodec.h>
import "C"
import (
"avcodec"
"unsafe"
)
type Codec avcodec.Codec
func (s *FormatContext) AvFormatGetVideoCodec() *Codec {
result := C.av_format_get_video_codec((*C.struct_AVFormatContext)(s))
return (*Codec)(result) // <- This also fails. Codec is based on avcodec.Codec.
}
我希望能够:
- 了解为什么它失败了,以及
- 确定如何更改打包方式,使函数使用在
avcodec
包中定义的Codec
类型。
提前感谢。
C.struct_AVCodec
和在另一个包中定义的C.struct_AVCodec
是不同的类型,因此它们之间的转换是不起作用的。如果你想要能够在其他包中从avcodec.Codec
转换它,你需要使用unsafe
,或者直接在整个程序中使用 C 类型。C 类型系统不是 Go 类型系统,手动转换通常是必要的。 - JimB