亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從不同的包實現接口(從其他模塊回調)

從不同的包實現接口(從其他模塊回調)

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 關注
  • 146 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號