如果我尝试这样的文件:
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可以创建可以访问以下方法的新类型 另一种类型?
答案 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。