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

time.Now() 和 time.Now().Local() 有什么区别?

time.Now() 和 time.Now().Local() 有什么区别?

Go
小唯快跑啊 2023-05-22 16:03:24
我在 golang 插件模块中有以下代码:即插即用package mainimport "fmt"var (    Thing        = New("first thing")    ThingFactory = thingFactory{})type thing struct {    i int    s string}func New(s string) thing {    return thing{s: s}}func (t *thing) Say() string {    t.i++    return fmt.Sprintf("%s - %d", t.s, t.i)}type thingFactory struct{}func (t thingFactory) Make(s string) thing {    return New(s)}它被编译为 .so 对象并在另一个程序中使用:主程序package mainimport (    "fmt"    "plugin")func main() {    p, err := plugin.Open("../plug/plug.so")    if err != nil {        panic(err)    }    symbol, err := p.Lookup("Thing")    if err != nil {        panic(err)    }    thing := symbol.(Sayer)    fmt.Println(thing.Say())    symbol, err = p.Lookup("ThingFactory") // <-problems start here    if err != nil {        panic(err)    }    factory := symbol.(GetSayer)    madeThing := factory.Make("how about me?")    fmt.Println(madeThing.Say())    fmt.Println(madeThing.Say())}type Sayer interface {    Say() string}type GetSayer interface {    Make(string) Sayer}我能够查找Thing, 并调用Say()它,但是第二个接口转换出现混乱:first thing - 1panic: interface conversion: *main.thingFactory is not main.GetSayer: missing method Make即使运行时将第一个符号识别为 a,Sayer它也没有识别出thingFactory显然有一个 Make() 方法,该方法应该返回同样是 Sayer 的东西。我在这里遗漏了一些明显的东西吗?
查看完整描述

2 回答

?
万千封印

TA贡献1891条经验 获得超3个赞

第一个问题是在你的插件中thingFactory(更准确地说*thingfactory)没有在你的主应用程序GetSayer界面中描述的方法:


Make(string) Sayer

你有:


Make(string) thing

所以(首先)你必须改成thingFactory.Make()这样:


type Sayer interface {

    Say() string

}


func (t thingFactory) Make(s string) Sayer {

    th := New(s)

    return &th

}

在此之后它仍然无法正常工作。这是因为插件的Sayer类型与您的主应用程序的类型不同Sayer。但它们必须相同才能实现您的主应用程序GetSayer界面。


一种解决方案是将接口“外包”Sayer给它自己的包,并在插件和主应用程序中使用这个通用的共享包。


让我们创建一个新包,将其命名为subplay:


package subplay


type Sayer interface {

    Say() string

}

导入这个包并在插件中使用它:


package main


import (

    "fmt"

    "path/to/subplay"

)


var (

    Thing        = New("first thing")

    ThingFactory = thingFactory{}

)


type thing struct {

    i int

    s string

}


func New(s string) thing {

    return thing{s: s}

}


func (t *thing) Say() string {

    t.i++

    return fmt.Sprintf("%s - %d", t.s, t.i)

}


type thingFactory struct{}


func (t thingFactory) Make(s string) subplay.Sayer {

    th := New(s)

    return &th

}

并在主应用程序中导入和使用它:


package main


import (

    "fmt"

    "path/to/subplay"

    "plugin"

)


func main() {

    p, err := plugin.Open("../plug/plug.so")

    if err != nil {

        panic(err)

    }

    symbol, err := p.Lookup("Thing")

    if err != nil {

        panic(err)

    }

    thing := symbol.(subplay.Sayer)

    fmt.Println(thing.Say())


    symbol, err = p.Lookup("ThingFactory")

    if err != nil {

        panic(err)

    }

    factory := symbol.(GetSayer)


    madeThing := factory.Make("how about me?")

    fmt.Println(madeThing.Say())

    fmt.Println(madeThing.Say())

}


type GetSayer interface {

    Make(string) subplay.Sayer

}

现在它可以工作了,输出将是:


first thing - 1

how about me? - 1

how about me? - 2


查看完整回答
反对 回复 2023-05-22
?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

你的插件 Make 方法应该返回一个 Sayer 对象而不是东西


type Sayer interface {

    Say() string

}

func (t *thingFactory) Make(s string) Sayer {

    return New(s)

}


查看完整回答
反对 回复 2023-05-22
  • 2 回答
  • 0 关注
  • 120 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信