Foo的x与Bar的x不同,因为non-exported标识符在包边界上永远不相等。通过导出foo.Foo和bar.Bar中的字段进行修复: type Foo struct { iface.FooI X string // <-- start with capital letter to export} 若要使用foo.Foo或bar.Bar作为参数值,foo.Foo和bar.Bar必须可分配给参数的类型。使用foo.Foo作为参数类型不起作用,因为命名类型不能相互分配。但是,当两种类型共享相同的基础类型时,命名类型可以分配给未命名类型。将参数声明为未命名类型: func AcceptBarOrFoo(struct { iface.FooI X string}) interface{} { return nil} 通过这些更改,将编译以下代码: AcceptBarOrFoo(bar.Bar{})AcceptBarOrFoo(foo.Foo{}) 在Go操场上运行示例 另一种选择是使用到公共类型的转换。在下面的代码中,foo.Foo是公共类型,bar.Bar被转换为foo.Foo。 func Accept(foo.Foo) interface{} { return nil}... Accept(foo.Foo{})Accept(foo.Foo(bar.Bar{})) 在Go操场