有人可以解释为什么这行不通吗?如果DoMove
采用结构而不是指针,则该方法有效。
package main
import (
"fmt"
)
type Vehicle interface {
Move()
}
type Car interface {
Vehicle
Wheels() int
}
type car struct {}
func (f car) Move() { fmt.Println("Moving...") }
func (f car) Colour() int { return 4 }
func DoMove(v *Vehicle) {
v.Move()
}
func main() {
f := car{}
DoMove(&f)
}
答案 0 :(得分:0)
非常简单。在DoMove()
函数中,变量为*Vehicle
类型(指向Vehicle
接口的指针)。指针根本没有方法Move
。
通常的做法是将接口用作函数参数,但是将指针传递给struct(并确保指针实现了接口)。例子
package main
import (
"fmt"
)
type Vehicle interface {
Move()
}
type Car interface {
Vehicle
Wheels() int
}
type car struct {
status string
}
func (f *car) Move() {
fmt.Println("Moving...")
f.status = "Moved"
}
func (f car) Status() string {
return f.status
}
func DoMove(v Vehicle) {
v.Move()
}
func main() {
f := car{status: "Still"}
DoMove(&f)
fmt.Println(f.Status())
}
输出:
Moving...
Moved
*汽车内容确实发生了变化。