方法未定义(类型没有方法)

时间:2020-09-05 19:35:11

标签: class oop go types

如果我尝试这样的文件:

package main
import "time"
type Alpha time.Time
func main() {
   o := Alpha.Now()
   n := o.Unix()
   println(n)
}

我得到这个结果:

Alpha.Now undefined (type Alpha has no method Now)

但是它可以与其他语言一起使用。例如PHP:

<?php
class Alpha extends DateTime {}
$o = new Alpha;
$n = $o->getTimestamp();
var_dump($n);

使用Go可以创建可以访问以下方法的新类型 另一种类型?

1 个答案:

答案 0 :(得分:4)

首先,time.Now()只是程序包级别的函数,而不是任何类型的方法。因此,正确的调用方式看起来像smth := time.Time(),而不是smth := time.Time.Now()

我们可以仔细看看该功能。它在软件包time中定义,当前实现如下:

func Now() Time {
    sec, nsec, mono := now()
    mono -= startNano
    sec += unixToInternal - minWall
    if uint64(sec)>>33 != 0 {
        return Time{uint64(nsec), sec + minWall, Local}
    }
    return Time{hasMonotonic | uint64(sec)<<nsecShift | uint64(nsec), mono, Local}
}

如您所见,它返回类型为time.Time的对象。然后可以将其用于随后的.Unix()方法调用:

func (t Time) Unix() int64 {
    return t.unixSec()
}

对于Unix(),对于接收者类型为time.Time的方法是正确的。

对于问题的扩展部分,您可以使用以下技巧:

package main
import "time"

type Alpha struct {
  time.Time
}

func main() {
   o := time.Now()
   a := Alpha { o }
   n := a.Unix()
   println(n)
}

Go不提供任何继承模型。但是,其合成功能非常强大。上面摘录中的代码基本上创建了一个新的结构类型Alpha,其匿名属性类型为time.Time。但是,由于跳过了该属性的显式名称,因此我们可以直接通过父结构访问包含的time.Time实例的方法。该技术称为Embedding