从函数签名可以看到,调用时
fmt.Println,
myCar将隐式转换为type的值
interface{}。fmt包中的代码然后进行类型切换以弄清楚如何打印此值,如下所示:
switch v := v.(type) {case string: os.Stdout.WriteString(v)case fmt.Stringer: os.Stdout.WriteString(v.String())// ...}但是,该
fmt.Stringer案例失败了,因为
Car未实现
String(如上定义
*Car)。
String手动调用有效,因为编译器认为
String需要a
*Car,因此会自动转换
myCar.String()为
(&myCar).String()。对于任何有关接口的内容,您都必须手动进行。因此,您要么必须实现
String,
Car要么总是将指针传递给
fmt.Println:
fmt.Println(&myCar)



