go:暴露的别名结构可以';t指定给内部结构文字

go:暴露的别名结构可以';t指定给内部结构文字,go,struct,model,Go,Struct,Model,我以以下方式排列我的模型: projectDir 梅因,加油 模型 走吧 莫德拉 莫代拉·戈 模型B 模式B.go 在main.go中: 包干管 import ( "test.local/projectDir/models" ) func main() { modelA := models.ModelA{ FieldA: "xx", FieldB: models.ModelB{ FiledC: "yy"

我以以下方式排列我的模型:

  • projectDir

    • 梅因,加油

    • 模型

      • 走吧
      • 莫德拉
        • 莫代拉·戈
      • 模型B
        • 模式B.go
main.go中
: 包干管

import (
    "test.local/projectDir/models"
)

func main() {
    modelA := models.ModelA{
        FieldA: "xx",
        FieldB: models.ModelB{
            FiledC: "yy"
        } // here will raise a error: cannot use models.ModelB literal (type models.ModelB) as type modelB.ModelB in field value
    }
}
models/models.go中

package models

import (
    "test.local/projectDir/models/modelA"
    "test.local/projectDir/models/modelB"
)
type ModelA modelA.ModelA
type ModelB modelB.ModelB
package modelA

import (
    "test.local/projectDir/models/modelB"
)

type ModelA struct {
    fieldA string
    fieldB modelB.ModelB
}
package modelB

type ModelB struct {
    fieldC string
}
模型/modelA/modelA.go
中:

package models

import (
    "test.local/projectDir/models/modelA"
    "test.local/projectDir/models/modelB"
)
type ModelA modelA.ModelA
type ModelB modelB.ModelB
package modelA

import (
    "test.local/projectDir/models/modelB"
)

type ModelA struct {
    fieldA string
    fieldB modelB.ModelB
}
package modelB

type ModelB struct {
    fieldC string
}
models/modelB/modelB.go中

package models

import (
    "test.local/projectDir/models/modelA"
    "test.local/projectDir/models/modelB"
)
type ModelA modelA.ModelA
type ModelB modelB.ModelB
package modelA

import (
    "test.local/projectDir/models/modelB"
)

type ModelA struct {
    fieldA string
    fieldB modelB.ModelB
}
package modelB

type ModelB struct {
    fieldC string
}

正如错误所指出的,结构类型是不同的。有没有更好的方法来组织模型?

错误是不言自明的:您试图将错误的值(
models.ModelB
)分配给
ModelB.ModelB
结构。
您可以通过导入正确的软件包轻松解决此问题:

import (
    "test.local/projectDir/models/modelB"
)

func main() {
    modelA := models.ModelA{
        FieldA: "xx",
        FieldB: modelB{
            FiledC: "yy",
        },
    }
}

错误消息中到底有什么不清楚?请注意,您不需要别名
modelB.modelB
来键入
models.modelB
。您可以定义一个新的命名类型。像这样的命名类型可以相互转换,但(因为它们是不同的类型)不能直接赋值。这将解决错误,但现在我必须逐个导入所有
模型。这就是Golang项目结构的工作方式。如果你不想一个接一个地导入所有的包,你可以把所有的模型放在一个包里面,这个包被分割成多个文件