让 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

我什至不确定这是解决这个问题的正确方法。谁能指出我正确的方向如何正确执行此操作?


牧羊人nacy
浏览 345回答 2
2回答

慕码人8056858

或者根本不声明文件,如果你不打算用它做任何事情。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.Closerfile, 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()

慕码人2483693

由于 go 是强类型的,您不能将不同的类型分配给同一个变量。解决问题的简单方法是在第二次调用中使用另一个变量。file2, err := macho.OpenFat(filename)if err != nil {    fmt.Println("Not an fat Mach-O file. Exiting.")    return}您还可以让 OpenFat 和 Open 方法返回相同的类型或实现相同的接口。这里很好地解释了 go 接口的工作原理。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go