2 回答

TA貢獻1804條經驗 獲得超3個贊
您有 2 個選項:
定義一個返回mqtt.MessageHandler并接受你的結構的函數
在您的結構上定義一個方法和相同的簽名mqtt.MessageHandler
type S struct{}
func MessageHandler(s S) mqtt.MessageHandler {
return func(client mqtt.Client, msg mqtt.Message) {
// use `s`
// ...
}
}
func (s *S) MessageHandler(client mqtt.Client, msg mqtt.Message) {
// use `s`
// ...
}
用法:
func main() {
s := S{}
mh := MessageHandler(s)
mh = s.MessageHandler // same type
// use mh
// ...
}

TA貢獻1820條經驗 獲得超9個贊
您需要從 func 返回處理程序,圍繞需要調用的結構對象創建一個閉包。
這是一種方法。請注意,我沒有使用 lib,所以下面的 main func 可能無法編譯,但你會明白的:
package main
import (
"fmt"
)
type SomeStruct struct{}
func (ss *SomeStruct) Invoke() {
fmt.Println("struct method called")
}
func GetHandler(s *SomeStruct) mqtt.MessageHandler {
return func(client mqtt.Client, msg mqtt.Message) {
fmt.Printf("Received message: %s from topic: %s\n", msg.Payload(), msg.Topic())
s.Invoke()
}
}
func main() {
handler := GetHandler(&SomeStruct{})
//pass to lib or assume it is invoked by lib
//handler(Client{}, Message{})
}
- 2 回答
- 0 關注
- 119 瀏覽
添加回答
舉報