对于struct,可以定义一个可以更新struct变量的func。有没有办法在interface中使用这些函数?
在下面的代码中,我尝试创建一个最小的示例来描述我的问题。定义了两个struct of Rect和Circle。这两个struct都具有Perimeter和Expand函数。Perimeter函数计算形状的周长。Expand函数通过更改形状的属性来增加形状的周长。此外,还定义了带有Shape方法签名的Perimeter接口。
viewShapeData函数接受Shape类型的输入参数。此函数查看形状的数据,并运行Perimeter方法并查看形状的周长。
package main
import "fmt"
type Shape interface {
Perimeter() float64
}
type Rect struct {
width float64
height float64
}
type Circle struct {
radius float64
}
func (s Rect) Perimeter() float64 {
return 2 * (s.width + s.height)
}
func (s Circle) Perimeter() float64 {
return 2 * 3.14 * s.radius
}
func (s *Rect) Expand(increaseValue float64) {
s.width += increaseValue / 2
}
func (s *Circle) Expand(increaseValue float64) {
s.radius += increaseValue / 3.14 / 2
}
func main() {
a := Circle{radius: 10.0}
b := Rect{width: 2.4, height: 5}
a.Expand(1)
viewShapeData(a)
b.Expand(1)
viewShapeData(b)
}
func viewShapeData(s Shape) {
fmt.Printf("value: %v, Type: %T, Perimeter: %f\n", s, s, s.Perimeter())
}现在,我正在寻找一种在Expand函数中调用viewShapeData方法的方法。我尝试了不同的方法,并在所描述的代码中应用了以下更改:
type Shape interface {
Perimeter() float64
Expand(float64)
}
func main() {
a := Circle{radius: 10.0}
b := Rect{width: 2.4, height: 5}
viewShapeData(a)
viewShapeData(b)
}
func viewShapeData(s Shape) {
s.Expand(1)
fmt.Printf("value: %v, Type: %T, Perimeter: %f\n", s, s, s.Perimeter())
}但这些错误似乎是:
cannot use a (type Circle) as type Shape in argument to viewShapeData:
Circle does not implement Shape (Expand method has pointer receiver)
cannot use b (type Rect) as type Shape in argument to viewShapeData:
Rect does not implement Shape (Expand method has pointer receiver)请给我一个解决方案,或者告诉我为什么Golang不支持这种编码。
发布于 2021-12-27 10:58:22
因此,如果要使用指针接收器,还应该将指针传递到接受接口的函数中。
例如
func main() {
a := Circle{radius: 10.0}
b := Rect{width: 2.4, height: 5}
a.Expand(1)
viewShapeData(&a)
b.Expand(1)
viewShapeData(&b)
}https://stackoverflow.com/questions/70494316
复制相似问题