为什么会出现“Composite Literal Uses Unkeyed”错误?

我是 Go 的新手,正在构建一个请求解码器。请求采用 JSON 格式,我们将其解码为 map[string]interface{}。然后我们将该对象数据传递给我们自己的 ProcessRequest 结构进行解码。正如我所说,我是新手,所以我在以前开发人员编写的代码的类似部分中重复使用了一些逻辑。本质上,我们正在检查地图中是否有必要的部分,然后设置并返回它们。有人可以向我解释为什么我会收到标题错误吗?我是否必须将项目一直设置为不再有任何嵌套的基本结构?有没有更好的方法来完成我想要的?这是代码和相关结构。它突出显示了 model.ProcessRequest 返回时的错误。蒂亚

type ProcessRequest struct {

    RequestID string

    Message   *message.Message

    Rule      *Rule

    Options   *ProcessOptions

    //TODO: Context EvaluatorContext

    //TODO: Links

}


type Message struct {

    ID         int

    Key        string

    Source     string

    Headers    *HeaderSet

    Categories *CategorySet

    Properties *PropertySet

    Streams    *StreamSet

}


type RuleAction struct {

    Name       string

    Expression map[string]interface{}

}


type RuleLink struct {

    LinkID       int

    Condition    map[string]interface{}

    TargetRuleID int

}


type Rule struct {

    Name    string

    Code    string

    Actions []RuleAction

    Links   []RuleLink

}

type object = map[string]interface{}


func DecodeProcessRequest(dataObject map[string]interface{}) (*model.ProcessRequest, error) {

    var (

        requestID string

        message   *message.Message

        rule      *model.Rule

        options   *model.ProcessOptions

        err       error

    )


    if reqIDSrc, ok := dataObject["requestId"]; ok {

        if requestID, err = converter.ToString(reqIDSrc); err != nil {

            return nil, errors.Wrapf(err, "Error reading property 'requestID'")

        }

        if requestID == "" {

            return nil, errors.Errorf("Property 'requestID' is an empty string")

        }

    } else {

        return nil, errors.Errorf("Missing required property 'requestID'")

    }

郎朗坤
浏览 66回答 1
1回答

12345678_0001

超级在这条评论中说:一般来说,警告说您应该更喜欢使用语法ProcessRequest{ RequestID: requestID, ... }. 命名键而不是未键值。那对我有用。此外,kostix在此评论中的解释也很有帮助。基本上这个想法是,如果您使用“无键”方式定义结构文字,则定义的含义取决于基础类型字段的布局方式。现在考虑您的类型具有string按特定顺序排列的三个类型字段。现在经过几次迭代,一些程序员将第二个字段移到了第一个位置——您的文字仍然可以编译,但最终会在运行时定义一个完全不同的值。
打开App,查看更多内容
随时随地看视频慕课网APP