我想在Go中开发一个库,它在go标准包(http://golang.org/pkg/debug/)中使用了调试包的不同文件格式。我们的想法是打开一个文件并打印出有关该文件的信息。 现在,我想通过测试所有相关文件类型自动识别正确的文件格式。例如,要测试文件是简单的Mach-O还是胖的Mach-O文件,我试图用两种Open方法打开文件:
file, err := macho.Open(filename)
if err != nil {
fmt.Println("Not an Mach-O file.")
}
file, err = macho.OpenFat(filename)
if err != nil {
fmt.Println("Not an fat Mach-O file. Exiting.")
return
}
不幸的是文件变量是(当然)类型选中,我收到以下错误:
cannot assign *macho.FatFile to file (type *macho.File) in multiple assignment
我甚至不确定这是接近这个的正确方法。任何人都可以指出我正确的方向如何正确地执行此操作?
答案 0 :(得分:2)
如果你不打算用它做任何事情,或者根本不申报文件。
if _, err := macho.Open(filename); err != nil {
fmt.Println("Not an Mach-O file.")
}
if _, err = macho.OpenFat(filename); err != nil {
fmt.Println("Not an fat Mach-O file. Exiting.")
return
}
如果你真的想在File上调用某个函数,那么你可以用你要调用的函数声明它是一个接口类型,然后你可以这样说:
var file io.Closer
file, err := macho.Open(filename)
if err != nil {
fmt.Println("Not an Mach-O file.")
}
file, err = macho.OpenFat(filename)
if err != nil {
fmt.Println("Not an fat Mach-O file. Exiting.")
return
}
file.Close()
在这种情况下它并不那么有趣,因为它看起来像是macho.File和macho.FatFile的唯一常用功能是Close()
答案 1 :(得分:0)
由于go是强类型的,因此您无法为同一个变量分配不同的类型。
解决问题的简单方法是在第二次调用中使用另一个变量。
file2, err := macho.OpenFat(filename)
if err != nil {
fmt.Println("Not an fat Mach-O file. Exiting.")
return
}
您也可以让OpenFat和Open方法返回相同的类型或实现相同的接口。
以下是关于接口如何工作的良好explanation。