如何将包的结构分配到具有相同字段的另一个包的结构中

时间:2017-12-02 10:17:36

标签: go struct

我在main包中有一个结构:

package main
type DispatchesDetailsStruct struct{}

我在包store中创建了另一个结构,其结构与main包中创建的结构相同。

package store
type DispatchesDetails struct{}

这是我要做的,我在store包中创建了一个带有return DispatchesDetails struct的函数。

func (s *DispatchStore) GetDispatchByCondition(dispatchObject DispatchesRequestStruct, objRaouteAvailability Availability) (dds []DispatchesDetails, err error) {}

现在我从store包中调用此main函数,并将返回值分配给main包结构但显示错误消息

  

无法将store.DispatchesDetails分配给DispatchesDetailsS​​truct类型。

我很困惑请帮助我。 感谢

3 个答案:

答案 0 :(得分:2)

main.DispatchesDetailsstore.DispatchesDetails是完全不同的类型。您可能想要选择一个并专门使用它。

例如,而不是:

package main

details := &DispatchesDetails{ ... }

使用:

package main

details := &store.DispatchesDetails{ ... }

答案 1 :(得分:1)

您需要在主包中导入商店包。 Go是严格打字的语言。在这里,您不能将结构分配给另一个结构,即使它们是相似的。虽然你可以embed将你的结构转换成另一个结构。

package main
import( 
      "store"
     )

type DispatchesDetailsStruct struct{

}

func main(){
  storedispatchObject := store.DispatchesDetailsStruct{}
  storedispatchObject.value = userDetails.value
  dispatchesList, err := dps.GetDispatchByCondition(storedispatchObject, objRaouteAvailability)
}

在上面的代码片段之后,DispatchesDetailsS​​truct将是商店类型,您可以在商店功能中使用它

答案 2 :(得分:1)

Go认为命名类型不同,即使它们具有相同的结构。

如果您需要在不同结构中使用相同类型,我建议这样做 - 将所有类型定义移至第3个包并从那里导入。

因此,您可以立即解决许多问题:

  1. 每种类型都定义一次。如果您需要进行一些更改,可以在一个地方进行更改。

  2. 所有定义都组合在一起 - 更容易找到。包含类型的包很小。

  3. 如果您需要来自其他包的类型,则永远不会遇到循环导入。

  4. 所以你可能会来这样的项目结构:

    github.com/user/project/schema  — types
    github.com/user/project/user  — some package for users
    github.com/user/project/resources  — types