我刚接触过golang,而且刚刚才掌握了它的诀窍。通过Tour of Go,然后加上我自己的理解来使用它。我在Interfaces上,开始用我自己的理解来实现。这是它的链接:Go PlayGround Link。

步骤1:我创建了3种类型:int、struct和接口。

package main

import (
    "fmt"
)

type MyInt int

type Pair struct {
    n1, n2 int
}

type twoTimeable interface {
    result() (int, int)
}

步骤2:然后,我为指针接收器实现了twoTimeable,因为它改变了底层值。

func (p *Pair) result() (int, int) {
    p.n1 = 2 * p.n1
    p.n2 = 2 * p.n2
    return p.n1, p.n2
}

func (m *MyInt) result() (int, int) {
    *m = 2 * (*m)
    return int(*m), 0
}

步骤3:然后在主函数中声明并分配Myint、结对及其相应的指针。我还声明了两个时间接口。

mtemp := MyInt(2)
var m1 MyInt
var m2 *MyInt
var p1 Pair
var p2 *Pair
m1, m2, p1, p2 = MyInt(1), &mtemp, Pair{3, 4}, &Pair{5, 6}
var tt twoTimeable

fmt.Println(" Values  : ", m1, *m2, p1, *p2, tt)

第4步:分配Myint、结对和它们的指针。

tt = m1
fmt.Println(tt.result())
fmt.Printf("Value of m1 %v
", m1)

tt = m2
fmt.Println(tt.result())
fmt.Printf("Value of m2 %v
", *m2)

tt = p1
fmt.Println(tt.result())
fmt.Printf("Value of p1 %v
", p1)

tt = p2
fmt.Println(tt.result())
fmt.Printf("Value of p2 %v
", *p2)

显示的错误:

prog.go:41:5: cannot use m1 (type MyInt) as type twoTimeable in assignment:
    MyInt does not implement twoTimeable (result method has pointer receiver)
prog.go:49:5: cannot use p1 (type Pair) as type twoTimeable in assignment:
    Pair does not implement twoTimeable (result method has pointer receiver)

我知道M1和p1是不可寻址的,这就是为什么它不能编译。但是,如果我使用p1或m1p1/m1.run()(自动取消FTW),那么方法结果()就可以正常工作了。

在步骤2中,当我将指针接收器更改为值接收者,并将m改为m时(我知道输出的变化):

func (p Pair) result() (int, int) {
    p.n1 = 2 * p.n1
    p.n2 = 2 * p.n2
    return p.n1, p.n2
}

func (m MyInt) result() (int, int) {
    m = 2 * (m)
    return int(m), 0
}

它就没有显示编译错误了。但是对于m2和p2就不能这样做,因为没有使用Myint和结对来实现结果。当接口方法实现有指针接收时,则不能容纳非指针。

Q1:为什么可以在值接收接口方法(PMyint)的结果()上使用指针(TT=m2),而在指针接收接口方法(PMyint)的结果()上使用值(TT=M1)?

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

如果函数接受Param(TTtwoTimeable),那么是否有一种方法,无论TT是类型指针还是非类型指针,我都能够调用tt.Result(),给定的结果()只定义为指针接收器?

看下面的代码:

func doSomething(tt twoTimeable) {
    temp1, temp2 := tt.result()
    fmt.Print("doing something with ", temp1, temp2)
} 

由于TT可以是任何预定义的类型(指针或非指针),因此param似乎不像是一个解决方案,或者我是否依赖于函数的用户来提供指针?如果我不需要更改基础值,例如使用值接收器,那这就不是个问题,因为TT可以保存值或指向该值的指针。

在线等回复。