为了账号安全,请及时绑定邮箱和手机立即绑定

让 go 变量接受多种类型

让 go 变量接受多种类型

Go
牧羊人nacy 2021-08-16 19:24:38
我想在 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 回答

?
慕码人8056858

TA贡献1803条经验 获得超6个赞

或者根本不声明文件,如果你不打算用它做任何事情。


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()


查看完整回答
反对 回复 2021-08-16
?
慕码人2483693

TA贡献1860条经验 获得超9个赞

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


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


file2, err := macho.OpenFat(filename)

if err != nil {

    fmt.Println("Not an fat Mach-O file. Exiting.")

    return

}

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


这里很好地解释了 go 接口的工作原理。


查看完整回答
反对 回复 2021-08-16
  • 2 回答
  • 0 关注
  • 344 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信