第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

Golang:創(chuàng)建一個接口來抽象可能具有可變參數(shù)的方法

Golang:創(chuàng)建一個接口來抽象可能具有可變參數(shù)的方法

Go
慕絲7291255 2023-03-07 11:36:36
我寫了一些創(chuàng)造“人類”的代碼。人類每 100 毫秒過一次生日,您可以像這樣訂閱事件:    pers1 := new(Human)    pers1.Init("John")    pers1.Subscribe(func(h Human) { fmt.Printf("Observer1 : %s", h.String()); return })    pers1.Subscribe(func(h Human) { fmt.Printf("Observer2 : %s", h.String()); return })    time.Sleep(3 * time.Second)輸出如下HUMAN John is born  // by initHUMAN John is now followed by 0x4901a0   // by subscribeThere is now 1 observersHUMAN John is now followed by 0x490300   // by subscribeThere is now 2 observers[T+0100ms]HUMAN John has its birthday      // after 100ms : birthday happensObserver1 : HUMAN : John is 1   // callbackObserver2 : HUMAN : John is 1   // callback// ... continue for 3 seconds詳細(xì)代碼在這里,但問題不在 https://goplay.tools/snippet/7qsZ1itcqrS我的問題如下:我想創(chuàng)建一個接口Producer對應(yīng)于產(chǎn)生我可以訂閱的事件的事物。您可以訂閱:過生日的人可檢測濕度變化的濕度傳感器收到郵件的郵件服務(wù)器...在我的例子中,回調(diào)函數(shù)有一個參數(shù):一個Human。那個年齡變了...以相同的方式,濕度傳感器的給定事件將期望傳感器結(jié)構(gòu)。我的問題是我認(rèn)為這樣做有意義嗎?(這是一個學(xué)者問題,沒有工作)如果是,如何。我找不到相關(guān)的例子那將是type Producer interface{      Subscribe( func( < something variable >) )}我無法得到一些工作。我也很難為這個問題找到一個好的標(biāo)題。隨意給我一個更好的。
查看完整描述

1 回答

?
波斯汪

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超4個贊

根據(jù)您的需要,此處提供三個可能適合您的選項(xiàng)。


選項(xiàng) 1:已發(fā)布項(xiàng)目的通用界面

不僅為可以擁有訂閱者的發(fā)布者創(chuàng)建一個接口,而且為那些發(fā)布者可以發(fā)布的東西創(chuàng)建一個接口:


type Item interface{

  Description() string

  Age() int

}


type human struct{

  age int

}


func (h *human) Description() string {

  return "human"

}


func (h *human) Age() int {

  return h.age

}


type Publisher interface{

  Subscribe(func(Item))

}


type humanProducer struct{

  subscribers []func(Item)

}


func (hp *humanProducer) Subscribe(f func(Item) {

  hp.subscribers = append(hp.subscribers, f)

}


// Example use

func addSubscriber(p Publisher, f func(Item)) {

  p.Subscribe(f)

}


func main() {

  hp := &humanProducer{}

  addSubscriber(p, func(i Item) {

    fmt.Printf("Got a %s that is %d years old.\n", i.Description(), i.Age())

  })

}

您現(xiàn)在可以通過讓它們實(shí)現(xiàn)接口來設(shè)置要發(fā)布的其他類型的東西Item。這里的和方法只是示例——您可以在其中添加任何您需要的方法Description。Age

優(yōu)點(diǎn)

  • 避免反射。

  • 避免類型參數(shù);適用于 Go 1.18 之前的版本。

  • 訂閱者可以接收多種項(xiàng)目。

  • 發(fā)布者可以發(fā)布多種項(xiàng)目。

缺點(diǎn)

  • 已發(fā)布的項(xiàng)目不能只是任何東西——您必須定義一組預(yù)先確定的功能,所有類型的已發(fā)布項(xiàng)目都必須具有這些功能。

  • 已發(fā)布的項(xiàng)目隱藏在界面后面,因此您只能使用界面中公開的功能Item,除非您開始強(qiáng)制轉(zhuǎn)換或使用反射。


選項(xiàng) 2:使用類型參數(shù)的接口

將類型參數(shù)添加到接口本身:

type human struct{

  age int

}


type Publisher[T any] interface{

  Subscribe(func(T))

}


type humanProducer struct{

  subscribers []func(*human)

}


func (hp *humanProducer) Subscribe(f func(*human) {

  hp.subscribers = append(hp.subscribers, f)

}


// Example use

func addSubscriber[T any](p Publisher[T], f func(T)) {

  p.Subscribe(f)

}


func main() {

  hp := &humanProducer{}

  addSubscriber[*human](p, func(h *human) {

    fmt.Printf("Got a human that is %d years old.\n", h.age)

  })

}

優(yōu)點(diǎn)

  • 避免反射。

  • 對可以發(fā)布的內(nèi)容沒有限制。

  • 已發(fā)布的項(xiàng)目不會隱藏在界面后面。

缺點(diǎn)

  • 發(fā)布者只能發(fā)布一種特定類型的項(xiàng)目。

  • 訂戶只能收到一種特定的物品。

  • 接口的任何使用都Publisher需要使用類型參數(shù)。僅適用于 Go 1.18 或更高版本。


選項(xiàng) 3:反射/鑄造

允許發(fā)布者發(fā)布任何內(nèi)容,并在訂閱者中使用反射或強(qiáng)制轉(zhuǎn)換來確定發(fā)布的內(nèi)容類型:

type human struct{

  age int

}


type Publisher interface{

  Subscribe(func(any))

}


type humanProducer struct{

  subscribers []func(any)

}


func (hp *humanProducer) Subscribe(f func(any) {

  hp.subscribers = append(hp.subscribers, f)

}


// Example use

func addSubscriber(p Publisher, f func(any)) {

  p.Subscribe(f)

}


func main() {

  hp := &humanProducer{}

  addSubscriber(p, func(i any) {

    if h, ok := any.(*human); ok {

      fmt.Printf("Got a human that is %d years old.\n", h.age)

    }

  })

}

如果使用 1.18 之前的 Go,請?zhí)鎿Qanyinterface{}. 此選項(xiàng)與選項(xiàng) 1 有點(diǎn)相同,只是Item接口為空。

優(yōu)點(diǎn)

  • 避免類型參數(shù);適用于 Go 1.18 之前的版本。

  • 對可以發(fā)布的內(nèi)容沒有限制。

  • 已發(fā)布的項(xiàng)目不會隱藏在界面后面。

  • 訂閱者可以接收多種項(xiàng)目。

  • 發(fā)布者可以發(fā)布多種項(xiàng)目。

缺點(diǎn)

  • 需要反射或投射,這是緩慢、笨拙且不太安全的。

  • 訂戶將不得不做額外的工作來弄清楚他們收到了什么樣的項(xiàng)目。


查看完整回答
反對 回復(fù) 2023-03-07
  • 1 回答
  • 0 關(guān)注
  • 144 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號