在Go中创建具有未导出的子结构的结构的实例

时间:2016-11-28 21:47:18

标签: go slack-api slack

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

这是我的代码:

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

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

1 个答案:

答案 0 :(得分:3)

首先,如果此处slack引用nlopes库,则slack.ReactionAddedEvent结构的Item字段不是指针,因此您无法存储地址无论如何slack.reactionItem结构到该字段中。其次,File的{​​{1}}字段是字符串,而不是结构。

第三,即使上面不是/不是这种情况,如果没有导出类型,但字段本身是,你不能在单个文字中组装结构。相反,您必须在创建结构变量后手动设置这些字段:

slack.reactionItem

但是,如果您使用的是m := &slack.ReactionAddedEvent{Reaction: "white_check_mark"} m.Item.File.Preview = "Test" m.Item.File.URLPrivate = "http://google.com" 库,那将无效,因为nlopes字段实际上不是一个结构: https://github.com/nlopes/slack/blob/master/websocket_reactions.go

第四,如果未导出类型,那么这可能是不应该操纵该类型对象的好兆头。在这种情况下,在File库中,这些结构仅用于解组,然后处理来自JSON消息的事件。