包的类型不能用作出售包的类型

时间:2016-06-29 06:24:03

标签: go struct

我正在尝试使用此Golang Yelp API package。在其某些结构中,它使用guregu's null package中定义的类型。

我想声明在Yelp API包中定义的结构,其中某些字段的null.Float作为值(i.e. this struct, which im trying to use)。所以在我的程序中,我导入了Yelp API包和guregu的null包,并尝试声明结构,ip.Lat和ip.Lat是float64s。 (null.FloatFrom definition)

 33         locationOptions := yelp.LocationOptions{
 34                 ip.Zip,
 35                 &yelp.CoordinateOptions{
 36                         Latitude: null.FloatFrom(ip.Lat),
 37                         Longitude: null.FloatFrom(ip.Lon),
 38                 },
 39         }

但是当我运行该程序时,它会告诉我:

./cli.go:36: cannot use "github.com/guregu/null".FloatFrom(ip.Lat) (type
"github.com/guregu/null".Float) as type "github.com/JustinBeckwith/go-
yelp/yelp/vendor/github.com/guregu/null".Float in field value

我尝试了两件事:

1)我没有导入null包,这导致Go抱怨null未定义。 2)我也尝试直接导入vendored包,这导致Go告诉我use of vendored package not allowed

关于如何解决此问题的任何想法?

4 个答案:

答案 0 :(得分:11)

这里的解决方案似乎是我试图使用的库需要重新设计以防止发生这种情况。

更改库的两种可能方法似乎是

1)根本不是供应商 - 如果依赖关系不需要是特定版本,则此方法有效。

2)出售,但不要向公众公开出售的图书馆。在库中创建一些包装函数,以便人们可以间接创建类型。

请参阅this discussion about vendoring on reddit for more ideas/reasons why.

答案 1 :(得分:8)

我有同样的问题。作为一种解决方法,我删除了相关软件包的供应商文件夹,并将其内容移至我的$ GOPATH文件夹。

答案来源:https://github.com/prometheus/prometheus/issues/1720

答案 2 :(得分:3)

刚遇到类似的问题。将两个库放在/vendor中解决。使用govendor get xxxx

答案 3 :(得分:0)

使用Godep时遇到了类似的问题,我通过删除/vendor并重新运行godep save ./...来解决-希望对您有所帮助。