首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使go变量接受多种类型

使go变量接受多种类型
EN

Stack Overflow用户
提问于 2014-09-20 16:07:49
回答 2查看 3.5K关注 0票数 0

我想在Go中开发一个库,它使用go标准包(http://golang.org/pkg/debug/)中调试包的不同文件格式。这样做的目的是打开一个文件并打印出有关该文件的信息。现在,我想通过测试所有相关的文件类型来自动识别正确的文件格式。例如,为了测试一个文件是简单的Mach-O还是胖的Mach-O文件,我尝试使用这两种open方法打开该文件:

代码语言:javascript
复制
  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
  } 

不幸的是,文件变量被选中(当然)类型,我得到以下错误:

代码语言:javascript
复制
cannot assign *macho.FatFile to file (type *macho.File) in multiple assignment

我甚至不确定这是否正确的方式来处理这个问题。谁能给我指出正确的方向如何正确地处理这个问题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-20 18:08:37

或者根本不要声明文件,如果您不打算对它做任何事情的话。

代码语言:javascript
复制
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)来声明它的接口类型,然后您可以这样说:

代码语言:javascript
复制
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()

票数 2
EN

Stack Overflow用户

发布于 2014-09-20 17:49:04

由于go是强类型的,所以不能将不同的类型分配给同一个变量。

解决问题的简单方法是在第二个调用中使用另一个变量。

代码语言:javascript
复制
file2, err := macho.OpenFat(filename)
if err != nil {
    fmt.Println("Not an fat Mach-O file. Exiting.")
    return
}

您还可以让OpenFat和OpenFat返回相同的类型或实现相同的接口。

下面是一个很好的关于go接口工作方式的解释

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25950701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档