有一个名为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中的贴片机将始终初始化?
答案 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
文件中,并将特定于操作系统的方法定义放在特定于操作系统的文件中,以避免不必要的重复代码。