为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
桃花长相依 2022-06-27 16:08:06
如果我尝试这样的文件:package mainimport "time"type Alpha time.Timefunc main() {   o := Alpha.Now()   n := o.Unix()   println(n)}我得到这个结果:Alpha.Now undefined (type Alpha has no method Now)但是它适用于其他语言。例如 PHP:<?phpclass Alpha extends DateTime {}$o = new Alpha;$n = $o->getTimestamp();var_dump($n);Go 有可能创建一个可以访问其他类型方法的新类型吗?
查看完整描述

1 回答

?
杨__羊羊

TA贡献1943条经验 获得超7个赞

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


我们可以仔细看看这个函数。它在打包时间中定义,目前实现如下:


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具有 type 匿名属性的新结构类型time.Time。但是,由于跳过了该属性的显式名称,我们可以time.Time直接通过父结构访问包含实例的方法。该技术称为嵌入。


查看完整回答
反对 回复 2022-06-27
  • 1 回答
  • 0 关注
  • 165 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号