gpt4 book ai didi

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

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

我的接口(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/

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