gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 02:04:24 26 4
gpt4 key购买 nike

我有这个

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") }

所以他们变得更相似了,但还是有两个

我知道我可以使用一个接口(interface)

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没有纯对象继承,我觉得只能将常用的业务逻辑放在一个私有(private)的封装函数中,在方法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))) }

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

关于Go:如何为相似的结构定义一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37209559/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com