Make go变量接受多种类型

时间:2014-09-20 16:07:49

标签: go

我想在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

我甚至不确定这是接近这个的正确方法。任何人都可以指出我正确的方向如何正确地执行此操作?

2 个答案:

答案 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