go - Go语言上的接口(interface)函数调用

标签 go interface

我的接口(interface)有问题。

这是我的 main.go 文件;

package main

import (
    "fmt"
    "bitbucket.org/xyz/trash/a"
)

// Second -
type Second interface {
    Area() float64
}

// Area -
func Area() float64 {
    return 2
}


func main() {

    r := new(a.Rect)

    n := new(Second)

    r.F = *n

    fmt.Println(r.Area()) 

}

还有我的另一个包,a.go;

package a

// First -
type First interface {
    Area() float64
}

// Rect -
type Rect struct {
    F First 
}

// Area -
func (r Rect) Area() float64 {
    return 1
}

我期待这一行

fmt.Println(r.Area())

打印“2”,而不是“1”。我错过了什么?

感谢您的帮助。

最佳答案

对于接口(interface)是什么存在误解。在 go 中,如果一个类型实现了为接口(interface)定义的函数,那么它就实现了一个接口(interface)。因此,在您的代码中,接口(interface) a.Firstmain.Second等价的。一个类型同时实现它们或根本不实现。

因此,Rect 类型既是 a.First 又是 main.Second。 Rect 中的字段 F 意味着它包含另一个实现 First 的类型(或 Second 因为它们是相同的)。

当您调用 r.Area() 时,go 会执行函数 func (r Rect) Area() uint64。使用 r.F = *n 行,您将接口(interface) Second 分配给 First(它们是等效的,没问题)。但是,如果您尝试调用 r.F.Area(),它会崩溃,因为 F 不是实现 First 的类型,它 First。

因此,您应该创建另一个实现 First 的类型,然后将其分配给 r。然后你可以调用 r.F.Area()

关于go - Go语言上的接口(interface)函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37298107/

相关文章:

oop - 为什么接口(interface)不能有构造函数而抽象类有构造函数

java - 如何在 Java 编译后保留接口(interface)的参数名称?

go - Go Lang 中更漂亮的方法

go - Go 中的文件路径

c# - 使用 IComparer 按另一个列表对带有自定义对象的列表进行排序

德尔福2009 : Is it possibly dangerous to use TList<[any interface]> with default comparator?

.net - 在 Visual Studio 的 Intellisense 中隐藏接口(interface)方法

go - 如何清除 close-on-exec 标志?

mongodb - 如何从 wasm 模块连接到本地 mongodb 实例?

bash - 如何通过golang获取环境变量PS1?