我有一个Foo带有方法的结构print:
type Foo struct {
Bar string
}
func (f Foo) print() {
fmt.Println(f.Bar)
}
如果我想打印一片Foo,规范的方法可能是写一个for循环,并有一个函数来封装它:
func printFoos(fs []Foo) {
for _, f := range fs {
f.print()
}
}
printFoos([]Foo{})
来自 OOP 背景,我觉得这种方法有点不吸引人。
我想做的是printFoos与[]Foo:
// Invalid Go code
func (fs []Foo) print() {
for _, f := range fs {
f.print()
}
}
上述方法不起作用,因为在 Go 中,不能将未命名类型用作方法接收器,如此 Google Group thread中所述。
为了规避它,可以写:
type Foos []Foo
func (fs Foos) print() {
for _, f := range fs {
f.print()
}
}
要使用它,我必须将类型显式声明为Foos,所以我仍然不能使用printon[]Foo
fs := []Foo{}
fs.print() // error
var fss Foos = fs
fss.print()
我感到困惑的是,在上面的代码中,fss并且fs显然属于同一类型,因为我可以毫无错误地分配fs给它fss。但是,我们不能简单地使用fs.print()Go 并让 Go 智能转换。
为什么会这样?
一只甜甜圈
四季花海
随时随地看视频慕课网APP
相关分类