这个问题没有我想的那么清楚,我会问一个更好的问题。但是我不想在此标记重复。因此,我已提出自己的问题。如果可以,可以将其删除以免混淆社区。请只做那些需要的。当您在这里时,请不要对我投反对票。抱歉,不清楚

我是golang的新手,刚掌握了它。

我正在学习环游,然后以自己的理解来使用它。
我当时在Interfaces并开始以自己的理解实施。
这是Go PlayGround链接

步骤1:我将3种类型设置为一个int,一个结构和一个接口

步骤2:然后我为指针接收器实现twoTimeable,因为它更改了基础值。

步骤3:然后,我在main函数中声明并分配了MyInt,Pair及其对应的指针。我还声明了twoTimeable接口

步骤4:我分配了MyInt,Pair及其指针(称为实现的方法)并打印出来。

它显示错误:

我也读了这个问题,我知道m1和p1无法寻址,这就是为什么它不能编译。
但是如果我使用p1或m1 p1/m1.result()(自动取消引用FTW),则方法result()会很好地工作

现在在步骤2中,当我将指针接收器更改为值接收器,并将* m更改为m(我知道Output的更改)

它突然不显示编译错误。不适用于m2和p2,因为现在没有使用* MyInt和* Pair实现结果的实现

这意味着如果接口方法实现具有值接收器tt可以容纳指针和值。
但是,当接口方法实现具有指针接收器时,它将无法保存非指针。

Q1 : Why it is fine to use pointers (tt = m2) on value receiver interface methods(p MyInt) result() , but not values (tt = m1) on pointer receiver interface method(p *MyInt) result().

现在让我们回到指针接收器。

Is there a way that if function accept param (tt twoTimeable) i will be able to invoke tt.result() irrespective tt being a pointer to type or not, given result() is only definded with pointer receiver.

请参见下面的代码:

由于tt可以是任何预定义的类型(指针或不是指针),因此支持参数(tt * twoTimeable,如果我什至可以做到)似乎不是解决方案,或者我是否依赖函数的用户来提供指针。如果我不必更改基础值,即使用值接收器,这不是问题,因为tt可以保存值或指向该值的指针

我总是接受答案。


Is there a way that if function accept param (tt twoTimeable) i will be able to invoke tt.result() irrespective tt being a pointer to type or not, given result() is only definded with pointer receiver.

这似乎是一个主要的误解。如果tt是接口类型twoTimetable的变量,则使用result方法,可以调用此方法。但是tt的基础类型根本没有关系。接口类型完全封装了相关的基础类型。接口类型提供了一组方法,可以调用这些方法,而不能调用其他方法。

具体类型(例如,您的MyInt)对类型为twoInterfaces的变量的可分配性问题是另一个问题。如果您的具体类型(例如MyInt)恰好具有由接口类型(此处为twoTimetables)定义的所有方法,则它是可分配的,如果不能,则不能分配。

问题"我的具体类型有什么方法"是第三个问题。这是唯一一个有点复杂的问题。在接收者T上定义的任何方法都是T的方法。对于指针类型* T,* T上的方法和T计数上的方法。


Q1 : Why it is fine to use pointers on value receiver methods but not vice vers?

因为语言规范说得很好:https://golang.org/ref/spec#Method_sets:

The method set of the corresponding pointer type *T is the set of all methods declared with receiver *T or T (that is, it also contains the method set of T).

(规格之所以可能是这样的:方便。)

对于其余的问题:我丝毫不知道你在问什么。 do Something的代码完全可以。在tt上调用result,它是实现result() (int, int)方法的任何类型。此类型是否为指针类型无关紧要。您可以从此方法调用中得到两个int,并且可以使用这些int执行任何操作。

(关于"指向接口的指针"部分:是的。从技术上讲,可以执行ttp *twoTimetable。但是您永远不需要这样做。永远不会。(当然,这是一个谎言,但是您所需要的情况是如此罕见而精致,以至于您真的从来不需要初学者,一旦您需要它,您就会知道如何使用它。)这里要记住一件事:永远不要做"指向接口的指针"。)


Shouldn't it for m2 and p2, because now there is no implementation of result using *MyInt and *Pair

否。您正在混淆不同的事物,并曲解了结果。

在大多数情况下,Go可让您省略指针取消引用。

看到最后一行? pp是指向Pair的指针,但无需编写(*pp).n1
该取消引用将自动插入(它是C中->运算符的自动变体)。

您的m2和p2只是包含指针的变量。如果需要,这些指针将被取消引用。这与指针/值接收器或接口无关。