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

从不同的包实现接口(从其他模块回调)

从不同的包实现接口(从其他模块回调)

Go
慕森卡 2023-05-15 09:50:06
在 NodeJS 中,我可以在一处声明回调并在一处使用它,以避免破坏项目的结构。一个.jsmodule.exports = class A(){    constructor(name, callback){        this.name = name;        this.callback = callback;    }    doSomeThingWithName(name){        this.name = name;        if(this.callback){            this.callback();        }    }}B.jsconst A = require(./A);newA = new A("KimKim", ()=> console.log("Say Oyeah!"));在 Go 中,我也想用接口和实现来做同样的事情。前type canDoSomething interface {    DoSomething()}type AStruct struct {    name string    callback canDoSomething}func (a *AStruct) DoSomeThingWithName(name string){    a.name = name;    a.callback.DoSomething()}B.goimport (A);newA = A{}newA.DoSomeThingWithName("KimKim");我可以覆盖文件 B.go 中接口函数的逻辑吗?我该怎么做才能使它们等同于 NodeJS 的样式?我试试import (A);newA = A{}// I want//newA.callback.DoSomething = func(){}...// or// func (a *AStruct) DoSomething(){}...// :/newA.DoSomeThingWithName("KimKim");
查看完整描述

2 回答

?
暮色呼如

TA贡献1853条经验 获得超9个赞

我可以覆盖文件 B.go 中接口函数的逻辑吗?


不,Go(和其他语言)中的接口没有任何逻辑或实现。


在 Go 中实现一个接口,我们只需要实现接口中的所有方法即可。


A 和 B 类型如何实现具有不同逻辑的相同接口:


type Doer interface {

    Do(string)

}


type A struct {

    name string

}

func (a *A) Do(name string){

    a.name = name;

    // do one thing

}


type B struct {

    name string

}

func (b *B) Do(name string){

    b.name = name;

    // do another thing

}


查看完整回答
反对 回复 2023-05-15
?
子衿沉夜

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

函数是 Go 中的第一类值,就像它们在 JavaScript 中一样。您在这里不需要界面(除非您没有说明其他目标):


type A struct {

    name string

    callback func()

}


func (a *A) DoSomeThingWithName(name string){

    a.name = name;

    a.callback()

}


func main() {

    a := &A{

        callback: func() { /* ... */ },

    }


    a.DoSomeThingWithName("KimKim")

}

由于所有类型都可以有方法,所以所有类型(包括函数类型)都可以实现接口。所以如果你真的想要,你可以让 A 依赖于一个接口并定义一个函数类型来提供即时实现:


type Doer interface {

    Do()

}


// DoerFunc is a function type that turns any func() into a Doer.

type DoerFunc func()


// Do implements Doer

func (f DoerFunc) Do() { f() }


type A struct {

    name     string

    callback Doer

}


func (a *A) DoSomeThingWithName(name string) {

    a.name = name

    a.callback.Do()

}


func main() {

    a := &A{

        callback: DoerFunc(func() { /* ... */ }),

    }


    a.DoSomeThingWithName("KimKim")

}


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

添加回答

举报

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