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

如果我尝试这样的文件:


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 有可能创建一个可以访问其他类型方法的新类型吗?


桃花长相依
浏览 166回答 1
1回答

杨__羊羊

首先,time.Now()它只是一个包级别的函数,而不是任何类型的方法。因此,调用它的正确方法看起来像smth := time.Time(),而不是smth := time.Time.Now()。我们可以仔细看看这个函数。它在打包时间中定义,目前实现如下:func Now() Time {&nbsp; &nbsp; sec, nsec, mono := now()&nbsp; &nbsp; mono -= startNano&nbsp; &nbsp; sec += unixToInternal - minWall&nbsp; &nbsp; if uint64(sec)>>33 != 0 {&nbsp; &nbsp; &nbsp; &nbsp; return Time{uint64(nsec), sec + minWall, Local}&nbsp; &nbsp; }&nbsp; &nbsp; return Time{hasMonotonic | uint64(sec)<<nsecShift | uint64(nsec), mono, Local}}如您所见,它返回一个类型为 的对象time.Time。然后可以将其用于随后的.Unix()方法调用:func (t Time) Unix() int64 {&nbsp; &nbsp; return t.unixSec()}如果Unix()它是类型为接收者的真正方法time.Time。对于问题的扩展部分,您可以使用以下技巧:package mainimport "time"type Alpha struct {&nbsp; time.Time}func main() {&nbsp; &nbsp;o := time.Now()&nbsp; &nbsp;a := Alpha { o }&nbsp; &nbsp;n := a.Unix()&nbsp; &nbsp;println(n)}Go 不提供任何继承模型。但是,它的合成能力非常强大。上面代码片段中的代码基本上创建了一个Alpha具有 type 匿名属性的新结构类型time.Time。但是,由于跳过了该属性的显式名称,我们可以time.Time直接通过父结构访问包含实例的方法。该技术称为嵌入。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go