-1

如何从接口获取底层指针类型?

package main

import (
    "fmt"
)

type Car interface  {
    Drive() string
}
type MyCar struct   {
    name string
}
func (MyCar) Drive (  ) string  {
    return "rum rum"
}


func main() {
    var car Car
    mycar := &MyCar{name:"mycar"}
    car = mycar
    mycarptr, err :=  car.(*MyCar)
    mycarvalue, err2 :=  car.(MyCar)
    fmt.Printf( "as ptr failed: %t, as value failed: %t\n", err, err2 )
    fmt.Printf( "as ptr: %+v, as value: %+v", mycarptr, mycarvalue)
}
4

2 回答 2

0

您对 *MyCar 的第一个断言工作正常

这是一个游乐场示例来说明

您对 MyCar 的第二个断言将失败,因为它不是指针。

于 2014-09-27T23:03:19.887 回答
0

为了能够修改汽车,您需要使用指向它的指针(就像您已经做过的那样),但是为了让其他人(和您自己)更清楚,您应该在指针上定义接口方法:

type Drivable interface {
    Drive() string
}

type Car struct {
    name string
}

func (*Car) Drive() string {
    return "rum rum"
}

type SpaceShip struct {
    name string
}

func (*SpaceShip) Drive() string {
    return "sound spaceships makes when you drive / fly them"
}

func Drive(d Drivable) {
    switch d := d.(type) { // d now is the actual type
    case *Car:
        fmt.Println("Got a car named", d.name)
    case *SpaceShip:
        fmt.Println("Got a spaceship named", d.name)
    }
}

playground

我建议阅读Effective Go,并特别注意接口和方法部分。

于 2014-09-27T23:45:54.173 回答