无法将struct type参数传递给另一个包中的函数

时间:2016-10-17 09:21:15

标签: go struct

我有两个包:offer.go和parser.go。我有一个struct cart类型的变量Data。我想将它作为参数传递给另一个包parser中的函数。但是我无法做到这一点。请查看以下内容:

offer.go

package offer

import "go_tests/Parser"

type Data struct {
    Id       int
    Quantity int
    Mrp      float64
    Discount float64
}
cart := make(map[int]Data)
//cart has some data in it
//passing it to parser
Parser.BXATP(offer_id, rule.Description, cart, warehouseId)

parser.go

package Parser

type Data struct {
    Id       int
    Quantity int
    Mrp      float64
    Discount float64
}

func BXATP(offer_id int, rule string, cart map[int]Data, warehouseId int){
 //my code is here
}

然而,运行此命令会出现以下错误:

 cannot use cart (type map[int]Data) as type map[int]Parser.Data in argument to Parser.BXATP

我找到了这个链接,但解决方案似乎并不适用于我的情况:

Why passing struct to function with literal struct parameter from current package differs from the same for function from another package?

我将解析器更改为:

func BXATP(offer_id int, rule string, cart map[int]struct {
    Id       int
    Quantity int
    Mrp      float64
    Discount float64
}, warehouseId int)

但现在错误是:

 cannot use cart (type map[int]Data) as type map[int]struct { Id int; Quantity int; Mrp float64; Discount float64 } in argument to Parser.BXATP

我不明白如何实现这一目标。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

为什么在两个包​​中定义了Data?如果您需要完全相同的结构,只需将其放在一个包装中即可。如果您将其保留在parser中,则可以执行以下操作:

package offer

import "go_tests/Parser"

cart := make(map[int]Parser.Data)
//cart has some data in it
//passing it to parser
Parser.BXATP(offer_id, rule.Description, cart, warehouseId)

在单独的包中定义的类型即使它们共享名称和底层结构也是不同的。因此Parser.Dataoffer.Data不兼容。

答案 1 :(得分:1)

您需要将每个结构字段分配给另一个结构字段,请参见示例:

package parser

import "./offer"

type Data struct {
    Id       int
    Quantity int
    Mrp      float64
    Discount float64
}
 func main(){

     offer_data := &offer.Data{} 

     parser_data :=  &Data{
         Id: offer_data.Id,
         Quantity: offer_data.Quantity,
         Mrp: offer_data.Mrp,
         Discount: offer_data.Discount,
     }
 }