Struct 无法在golang中包含多个文件

Struct 无法在golang中包含多个文件,struct,go,compilation,Struct,Go,Compilation,我知道以前有人问过我这个问题,我也尝试过所有可能的答案,但没有什么对我没有帮助 不过,我想再次提出这个问题,并详细阐述我的问题。实际上,我试图在main.go文件中包含一个简单的文件。我的文件夹结构和其余信息如下: \src\ Multi-file\ lib\Car.go main.go 汽车。出发 package main type Car struct { numberOfDoors int cylinders int

我知道以前有人问过我这个问题,我也尝试过所有可能的答案,但没有什么对我没有帮助

不过,我想再次提出这个问题,并详细阐述我的问题。实际上,我试图在main.go文件中包含一个简单的文件。我的文件夹结构和其余信息如下:

\src\
   Multi-file\
     lib\Car.go
   main.go
汽车。出发

 package main

    type Car struct {
        numberOfDoors int
        cylinders int
    }
package main 

import (
    "fmt"
)

func main() {
    c := Car{4,6}
    fmt.Println(c)
}
package car

type Car struct {
    NumberOfDoors int
    Cylinders     int
}
package main

import (
    "car"
    "fmt"
)

func main() {
    c := car.Car{4, 6}
    fmt.Println(c)
}
main.go

 package main

    type Car struct {
        numberOfDoors int
        cylinders int
    }
package main 

import (
    "fmt"
)

func main() {
    c := Car{4,6}
    fmt.Println(c)
}
package car

type Car struct {
    NumberOfDoors int
    Cylinders     int
}
package main

import (
    "car"
    "fmt"
)

func main() {
    c := car.Car{4, 6}
    fmt.Println(c)
}
当我完成main.go时,我得到以下错误

# command-line-arguments
.\main.go:8: undefined: Car
以下是我的go env详细信息:

set GOARCH=amd64
set GOBIN=
set GOEXE=.exe
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GOOS=windows
set GOPATH=C:\xampp\htdocs\golang
set GORACE=
set GOROOT=C:\Go
set GOTOOLDIR=C:\Go\pkg\tool\windows_amd64
set GO15VENDOREXPERIMENT=
set CC=gcc
set GOGCCFLAGS=-m64 -mthreads -fmessage-length=0
set CXX=g++
set CGO_ENABLED=1
仅供参考:我也尝试过将其作为一个甚至没有帮助我的包


任何帮助都将不胜感激

按照说明设置程序和库的工作区:

例如,一个双文件
main

src/car
├── car.go
└── main.go

$ cd src/car
$ go run main.go car.go
{4 6}
$ go build car && ./car
{4 6}
$ go install car && car
{4 6}
$ 
main.go

package main

import (
    "fmt"
)

func main() {
    c := Car{4, 6}
    fmt.Println(c)
}
package main

type Car struct {
    numberOfDoors int
    cylinders     int
}
car.go

package main

import (
    "fmt"
)

func main() {
    c := Car{4, 6}
    fmt.Println(c)
}
package main

type Car struct {
    numberOfDoors int
    cylinders     int
}

您不应该有两个文件,它们声明在同一个包中,但不在同一个目录中。一种解决方案可能是使用此目录结构:

src\
  car\
    car.go
  main.go
汽车。出发

 package main

    type Car struct {
        numberOfDoors int
        cylinders int
    }
package main 

import (
    "fmt"
)

func main() {
    c := Car{4,6}
    fmt.Println(c)
}
package car

type Car struct {
    NumberOfDoors int
    Cylinders     int
}
package main

import (
    "car"
    "fmt"
)

func main() {
    c := car.Car{4, 6}
    fmt.Println(c)
}
main.go

 package main

    type Car struct {
        numberOfDoors int
        cylinders int
    }
package main 

import (
    "fmt"
)

func main() {
    c := Car{4,6}
    fmt.Println(c)
}
package car

type Car struct {
    NumberOfDoors int
    Cylinders     int
}
package main

import (
    "car"
    "fmt"
)

func main() {
    c := car.Car{4, 6}
    fmt.Println(c)
}
当然,
Car
结构不在
main
包中,我必须:

  • car.car
    struct中
    NumberOfDoors
    columns
    字段的第一个字母更改为大写,以便可以从
    main
    包访问它们
  • 将对
    Car{4,6}
    的调用替换为
    Car.Car{4,6}
  • car.go中的代码
    不再是包
    main
    的一部分,您现在可以将其作为
    car
    库查看。这就是为什么
    Car
    struct现在被声明为
    包Car
这样,您可以通过以下步骤一步构建和运行:

go run main.go

如果您是Go链接器,您将如何决定在\src结构中查找汽车定义?更友好地按照手册中的建议加工和构造您的软件包,并明确导入您需要的内容我尝试了您的代码,但我发现以下错误,main.go:4:5:import“car”是一个程序,不是一个可导入的软件包@peterSO code确实有效,但我对您的答案很好奇,那么你能告诉我是什么问题吗?@FRSTAR我没有这个错误,代码对我有效。您确定在
car.go
文件中将
package main替换为
package car`?我忘了在我的代码解释中指出这一点,我现在添加它哇,你真的破解了代码,但是我想澄清几件事,1)。go run*.go(这行代码对我不起作用)2)和3)都起作用了,在这行代码之后,我不需要执行下面的go run main.go吗?正如@arainone在下面解释的那样。@FRSTAR:通配符globs,例如,
*.go
,是Linux的快捷方式。在Windows上,列出每个文件,例如,
go-run main.go-car.go
@FRSTAR:
go-run
编译并运行包含命名go源文件的主程序包
go build
编译由导入路径命名的包及其依赖项,但不安装结果
go install
编译并安装由导入路径命名的包及其依赖项。看见