首页 > 解决方案 > 为什么 proto marshal 然后 unmarshal 在包含供应商目录的项目之外运行时会失败?

问题描述

我有一个main.go文件,它使用原始文件pkg/models到 Marshal 和 Unmarshal 一个 proto 结构,如下所示:

// Convert to string
protoStr := proto.MarshalTextString(proto)

// Unmarshal string back to proto struct
var proto2 models.Stuff
err := proto.UnmarshalText(protoStr, &proto2)

设置在这里:https ://github.com/chuyval/qqs/tree/master/q2

该项目包含一个仅github.com/golang/protobuf签出 repo 的供应商目录。glide install(如果供应商不存在,则运行以创建供应商)

从项目内部运行时,该main.go程序运行良好go run main.go

当我将main.go文件上移一级到父目录并go run main.go在父级运行相同的命令时,它报告以下错误:

line 2: unknown field name "value_list" in models.Stuff

当我删除项目目录中的供应商目录并go run main.go在父级别运行时,我没有收到错误。

为什么在项目存储库中有一个供应商目录会使其出错?

需要注意的另一件事是,如果我main.go在依赖存储库中运行相同的应用程序,它每次都可以工作(有或没有供应商存储库)。

示例代码:

package main

import (
    "github.com/chuyval/qqs/q2/pkg/models"
    "github.com/golang/protobuf/proto"
    "log"
)

func main () {
    stuff := createProtoStuff()
    log.Printf("Stuff: %+v", stuff)

    // Convert to string
    stuffStr := proto.MarshalTextString(stuff)

    // Unmarshal string back to proto struct
    var stuff2 models.Stuff
    err := proto.UnmarshalText(stuffStr, &stuff2)
    if err != nil {
        log.Printf("It didnt work. Error: %s", err.Error())
    } else {
        log.Printf("It worked. Proto: %+v", stuff2)
    }
}

func createProtoStuff() *models.Stuff {
    someValueList := []*models.SomeValue{&models.SomeValue{Id: "Some Value ID"}}

    valueList := &models.SomeValueList{SomeValue: someValueList}

    stuffValueList := &models.Stuff_ValueList{
        ValueList: valueList,
    }

    stuff := &models.Stuff{
        Id: "Stuff List Id",
        Stuff: stuffValueList,
    }

    return stuff
}

软件版本

glide version 0.13.1
go version go1.10.3 darwin/amd64
protoc version libprotoc 3.6.0

标签: goprotocol-buffersglide-golang

解决方案


推荐阅读