我想在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我甚至不确定这是否正确的方式来处理这个问题。谁能给我指出正确的方向如何正确地处理这个问题?
发布于 2014-09-20 18:08:37
或者根本不要声明文件,如果您不打算对它做任何事情的话。
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上调用某个函数,那么您可以用要调用的func(s)来声明它的接口类型,然后您可以这样说:
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()
发布于 2014-09-20 17:49:04
由于go是强类型的,所以不能将不同的类型分配给同一个变量。
解决问题的简单方法是在第二个调用中使用另一个变量。
file2, err := macho.OpenFat(filename)
if err != nil {
fmt.Println("Not an fat Mach-O file. Exiting.")
return
}您还可以让OpenFat和OpenFat返回相同的类型或实现相同的接口。
下面是一个很好的关于go接口工作方式的解释。
https://stackoverflow.com/questions/25950701
复制相似问题