Go:在一个包中使用相同的名称和内容结构,其中一个将被初始化

时间:2017-06-23 22:57:56

标签: go

有一个名为mount的包,它有两个相同的名称和内容结构

  

mount_linxu.go

package mount
import "fmt"
type Mounter struct {
}
func (mounter *Mounter) DoMount(path string) (bool ,error){
fmt.Printf("this is linux")
return true , nil
}
  

mount_mac.go

package mount
import "fmt"
type Mounter struct {
}
func (mounter *Mounter) DoMount(path string) (bool ,error){
fmt.Printf("this is mac")
return true , nil
}
  

mount_test.go

func TestNew(t *testing.T) {
 mounter := New()
 mounter.DoMount("")
}

我的问题是为什么mount_mac.go中的贴片机将始终初始化?

2 个答案:

答案 0 :(得分:1)

如上所述,由于您在同一个包中声明Mounter两次,因此这些文件无法编译。

你做这项工作的选择是:

1)为每个文件使用两个不同的包,例如:

/src/components/mac/mount_mac.go

/src/components/linux/mount_linux.go

然后,在每种情况下导入所需的包。

2)使用条件构建,以便根据您所定位的平台,仅包含其中一个文件。 您可以在每个文件中使用// +build标记。

点击此处了解详情:https://golang.org/pkg/go/build/#hdr-Build_Constraints

答案 1 :(得分:1)

如果您使用正确的文件后缀,它们将根据操作系统有条件地构建。 Go并未将MacOS称为" mac",它将其称为" darwin" (Mac内核)。它也正确拼写了" linux",虽然我不知道这是否只是问题中的拼写错误,或者你的磁盘上的文件名是否具有相同的拼写错误。或者,您可以使用显式build constraints而不是文件名,但文件名是OS或架构特定代码的惯用语。

如果结构定义相同,则可以将结构放在通用mount.go文件中,并将特定于操作系统的方法定义放在特定于操作系统的文件中,以避免不必要的重复代码。