Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go:如何为类似的结构定义一个函数_Go - Fatal编程技术网

Go:如何为类似的结构定义一个函数

Go:如何为类似的结构定义一个函数,go,Go,我有这个 type File struct{} type FileRead struct { File } type FileWrite struct { File } type CppRead struct { FileRead } type CppWrite struct { FileWrite } func (f *File) Open(name string, mod string) { fmt.Println("open", name, mo

我有这个

type File struct{}

type FileRead struct {
    File
}
type FileWrite struct {
    File
}
type CppRead struct {
    FileRead
}
type CppWrite struct {
    FileWrite
}

func (f *File) Open(name string, mod string) {
    fmt.Println("open", name, mod)
}
func (f *FileRead) Open(name string)  { f.File.Open(name, "read") }
func (f *FileWrite) Open(name string) { f.File.Open(name, "write") }
func (f *CppRead) Open(name string)   { f.FileRead.Open(name + ".cpp") }
func (f *CppWrite) Open(name string)  { f.FileWrite.Open(name + ".cpp") }

func main(){
    cpp := &CppWrite{}
    cpp.Open("main")
}
我不喜欢它,因为有两个函数做同样的事情:

func (f *CppRead) Open(name string)
func (f *CppWrite) Open(name string)
我可以把它们重写为

func (f *CppRead) CppOpen(name string)   { f.Open(name + ".cpp") }
func (f *CppWrite)CppOpen(name string)   { f.Open(name + ".cpp") }
因此,它们变得更加相似,但仍然有两个

我知道我可以使用接口

type FileRWOpener interface {
    Open(string)
}
func CppOpen(file FileRWOpener, name string) {
    file.Open(name + ".cpp")
}
func main() {
    cpp := &CppWrite{}
    CppOpen(cpp, "main")
}
但我想把它当作

cpp.Open("name") // not CppOpen(cpp, "main")

Go没有纯对象继承,我认为您只能将公共业务逻辑放在私有包函数中,并在方法Open的两个实现中调用该函数

func changeFileName(name string) { return name + ".cpp" }
func (f *CppRead) Open(name string)   { f.FileRead.Open(changeFileName(name)) }
func (f *CppWrite) Open(name string)  { f.FileWrite.Open((changeFileName(name))) }

这是一个非常简单的示例,业务逻辑可能更复杂。

除非您看到函数添加文件扩展名带来的巨大好处,否则您可以摆脱
(f*CppRead)Open
(f*cpprite)Open
,只需使用
CppOpen(cpp,“main.cpp”)
这只是一个简单的示例,在实际的程序中,它会使工作更有用。