gpt4 book ai didi

go - 静态类型定义与动态查找

转载 作者:IT王子 更新时间:2023-10-29 01:40:01 27 4
gpt4 key购买 nike

上书The Go Programming Language Phrasebook说:

If you require performance, then you can use statically typed definitions and avoid the dynamic lookup. If you require flexibility, then you can use the late binding mechanism of interfaces

谁能解释一下 Go 中的方法和函数的“静态类型定义”和“动态查找”是什么?

最佳答案

假设我们有以下代码:

type A struct {}

func (a A) Foo() {
fmt.Println("Foo called")
}

type I interface {
Foo()
}

我现在可以创建一个 A 类型的变量并调用此方法:

a := A{}
a.Foo()

编译器知道变量的静态类型,所以知道方法调用指的是A.Foo方法。因此它可以将上面的代码编译为使用对 A.Foo 的直接调用,这将与普通函数调用一样快。

如果我们使用 I 类型的变量,情况就不同了:

var i I = A{}
i.Foo()

变量i 可以包含任何具有Foo 方法的类型。在这种特殊情况下,它持有一个 A 值,但在编译时不一定知道这一点。因此,编译器生成代码来检查 i动态类型,查找关联的 Foo 方法并最终调用该方法。这种分派(dispatch)形式比第一种形式慢,但好处是代码适用于实现该接口(interface)的任何类型。

这类似于 C++ 对虚方法和非虚方法的区分,不同之处在于方法的调度类型不是在其定义时固定的,而是取决于您在 Go 中使用的变量类型。

关于go - 静态类型定义与动态查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23000513/

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