作为结构体字段或结构体方法的函数

8

请问在什么情况下更适合将函数作为结构体字段使用,何时适合将其作为结构体的方法?

1个回答

10

一个函数类型的字段并不是方法,因此它不属于结构体类型的方法集合。使用结构体类型作为接收器声明的“真正的”方法将成为方法集合的一部分。

话虽如此,如果你想要实现一个接口,你别无选择,只能定义“真正的”方法。

方法是“附加”到具体类型上的,不能在运行时更改。函数类型的字段可以用来“模拟”虚方法,但是像前面所说的那样,这不是一个方法。函数类型的字段可以在运行时重新分配。

就像这个例子:

type Foo struct {
    Bar func()
}

func main() {
    f := Foo{
        Bar: func() { fmt.Println("initial") },
    }
    f.Bar()

    f.Bar = func() { fmt.Println("changed") }
    f.Bar()
}

Go Playground上尝试此代码,它将输出:
initial
changed

函数类型的字段通常用于存储回调函数, 标准库中的例子包括 http.Serverhttp.Transport


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接