go非接口的任意类型T()都能够调用*T的方法吗?反过来呢?

go的类型T()可以调用T的方法,因为T本质上是一个指针类型。然而,如果T是一个非接口类型,则不能将T类型的值直接转换为T类型,也就无法调用*T的方法。

但是,如果T实现了接口类型,则可以通过类型断言来调用*T的方法。例如:

type MyType struct {
  // Some fields...
}

func (t *MyType) MyMethod() {
  // Some code...
}

type MyInterface interface {
  MyMethod()
}

var x MyType

// This will not work, because x is not a pointer to MyType:
x.MyMethod()

// But this will work, because we can assert that x implements the
// MyInterface interface, which requires a pointer receiver:
y := x.(MyInterface)
y.MyMethod()

反过来,如果T实现了接口类型,则可以将T类型的值直接转换为该接口类型的值,并调用该接口的方法。例如:

type MyType struct {
  // Some fields...
}

func (t *MyType) MyMethod() {
  // Some code...
}

type MyInterface interface {
  MyMethod()
}

var x *MyType

// This will work, because x is a pointer to MyType, and MyType
// implements the MyInterface interface:
y := MyInterface(x)
y.MyMethod()

总的来说,如果T是非接口类型,则只能在T实现了接口类型时才能调用T的方法。