我正在为 mqtt 编写一个客户端。 我为 mqtt.OnConnectHandler 编写了一个回调。 我想写打印服务器的连接地址。
var connectHandler mqtt.OnConnectHandler = func(c mqtt.Client) {
// this is ok
options := c.OptionsReader()
s := options.Servers()
fmt.Printf("conn: %s success\n", s)
// --------------------------------------
// But it won't work like this
// here have error: On servers。
// cannot call pointer method Servers on mqtt.ClientOptionsReadercompilerInvalidMethodExpr
o := c.OptionsReader().Servers()
fmt.Printf("conn: %s success\n", o)
}
所以,我发现我不能直接使用它。为什么? 它们不是同一个东西吗? 为什么我只能使用中间变量来接收?
我尝试了两种方法。 成功只有一次。 我以为两个都可以。
这是因为
Servers
方法是用指针接收器声明的。这意味着为了呼叫 Servers
,接收者必须可寻址:
https://go.dev/ref/spec#Address_operators
临时变量是不可寻址的。这里:
c.OptionsReader().Servers()
c.OptionsReader()
返回一个不可寻址的值,因此您不能使用它作为接收者来调用 Servers
。当您将 c.OptionsReader
的返回值分配给变量时,它就变得可寻址,并且您可以使用该变量调用 Servers()
。