为什么不能将嵌入式类型作为指针传递

时间:2018-09-06 19:42:18

标签: go

有人可以解释为什么这行不通吗?如果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)

}

1 个答案:

答案 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

*汽车内容确实发生了变化。