2016-11-28 44 views
0

我正在尝试手动创建一个类型为ReactionAddedEvent的实例,并给出here, in nlopes' Go Slack library。但是,子类型reactionItem是未导出的,导致我在尝试实例化对象时收到错误./bot_test.go:111: cannot refer to unexported name slack.reactionItem在Go中创建一个包含未导出子结构的实例

这里是我的代码:

m := &slack.ReactionAddedEvent{ Item: &slack.reactionItem{ File: &slack.File{ Preview: "Test", URLPrivate: "http://google.com", }, }, Reaction: "white_check_mark", }

当我在那个片段,从第2行中删除标识&slack.reactionItem,我得到的,而不是错误:./bot_test.go:112: missing type in composite literal,效果显着。

有什么办法让我用我需要的参数实例化这种类型的对象吗?

回答

3

首先,如果slack这里指的是nlopes库,该slack.ReactionAddedEvent结构的Item场不是指针,所以你不能存储slack.reactionItem结构进入该领域的地址呢。其次,slack.reactionItemFile字段是一个字符串,而不是一个结构。第三,即使上述不是/不是这种情况,如果类型没有被导出,但是这些字段本身是,你不能在一个单独的文字中组装结构。相反,你必须创建结构变量后手动设置这些字段:再次

m := &slack.ReactionAddedEvent{Reaction: "white_check_mark"} 
m.Item.File.Preview = "Test" 
m.Item.File.URLPrivate = "http://google.com" 

但是,如果你使用的nlopes库,这是行不通的,因为File场实际上不是结构: https://github.com/nlopes/slack/blob/master/websocket_reactions.go

;第四,如果没有出口的类型,这可能是你不应来操纵该类型的对象是个好兆头。在这种情况下,在nlopes库中,这些结构仅用于解组并然后处理来自JSON消息的事件。

+0

为什么该软件包会首先导出ReactionAddedEvent? – mpm

+1

它是未导出结构的typedef,但它看起来像导出类型(带有导出字段),因此库的客户端可以为事件类型实现处理程序。从他们的示例字段:https://github.com/nlopes/slack/blob/master/examples/websocket/websocket.go – Kaedys

+3

然而,这个想法似乎是事件是由松散库创建_create_事件作为JSON消息接收,然后转换为客户端可以为其设置处理程序的这些导出类型事件。客户不应该自己创建事件。 – Kaedys

相关问题