我使用过GOPATH,但对于目前我面临的这个问题,它没有帮助。我希望能够创建特定于项目的包:
myproject/
├── binary1.go
├── binary2.go
├── package1.go
└── package2.go
我尝试了多种方法,但我怎么得到package1 ?在二进制中工作。Go或者binary2。等等?
例如;我希望能够导入“package1”,然后能够运行去构建binary1。go,一切正常工作,而不会抛出在GOROOT或GOPATH上找不到包的错误。我需要这种功能的原因是大型项目;我不想引用多个其他包或将它们保存在一个大文件中。
自从围棋的引入。mod,我认为本地和外部包管理变得更容易。使用。mod,它是可能有go项目之外的GOPATH以及。
导入本地包:
创建一个文件夹demoproject并运行以下命令生成go。国防部文件
去mod init demoproject
我有一个项目结构如下demoproject目录。
├── go.mod
└── src
├── main.go
└── model
└── model.go
出于演示目的,在模型中插入以下代码。文件。
package model
type Employee struct {
Id int32
FirstName string
LastName string
BadgeNumber int32
}
在主。go,我通过引用demoproject/src/model导入Employee模型
package main
import (
"demoproject/src/model"
"fmt"
)
func main() {
fmt.Printf("Main Function")
var employee = model.Employee{
Id: 1,
FirstName: "First name",
LastName: "Last Name",
BadgeNumber: 1000,
}
fmt.Printf(employee.FirstName)
}
导入外部依赖:
只需在项目目录中运行go get命令。
例如:
go get -u google.golang.org/grpc
它应该立即包含模块依赖项。国防部文件
module demoproject
go 1.13
require (
golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa // indirect
golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9 // indirect
golang.org/x/text v0.3.2 // indirect
google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150 // indirect
google.golang.org/grpc v1.26.0 // indirect
)
https://blog.golang.org/using-go-modules
也许您正在尝试模块化您的包。我假设package1和package2在某种程度上是同一个包的一部分,但为了可读性,您将它们拆分为多个文件。
如果前面的案例是你的,你可以在这些多个文件中使用相同的包名,就像有相同的文件一样。
这是一个例子:
add.go
package math
func add(n1, n2 int) int {
return n1 + n2
}
subtract.go
package math
func subtract(n1, n2 int) int {
return n1 - n2
}
donothing.go
package math
func donothing(n1, n2 int) int {
s := add(n1, n2)
s = subtract(n1, n2)
return s
}
我不是围棋专家,这是我在stackoverflow的第一个帖子,所以如果你有一些建议,它会很受欢迎。
你可以使用replace
go mod init example.com/my/foo
foo / go.mod
module example.com/my/foo
go 1.14
replace example.com/my/bar => /path/to/bar
require example.com/my/bar v1.0.0
foo / main.go
package main
import "example.com/bar"
func main() {
bar.MyFunc()
}
酒吧/ go.mod
module github.com/my/bar
go 1.14
酒吧/ fn.go
package github.com/my/bar
import "fmt"
func MyFunc() {
fmt.Printf("hello")
}
导入本地包就像导入外部包一样
除了在里面走。Mod文件将外部包名称替换为本地文件夹。
文件夹的路径可以是完整的或相对的/path/to/bar或../bar
https://github.com/golang/go/wiki/Modules#when-should-i-use-the-replace-directive
https://thewebivore.com/using-replace-in-go-mod-to-point-to-your-local-module/
没有所谓的“本地套餐”。磁盘上包的组织与包的任何父/子关系是正交的。包形成的唯一真正的层次结构是依赖树,在一般情况下它不反映目录树。
只使用
import "myproject/packageN"
不要无缘无故地反对构建系统。在任何重要的程序中,每次导入都保存十几个字符不是一个好理由,因为,例如,具有相对导入路径的项目是不容易获得的。
导入路径的概念有一些重要的属性:
导入路径可以是全局唯一的。
结合GOPATH,导入路径可以明确地转换为目录路径。
GOPATH下的任何目录路径都可以明确地转换为导入路径。
使用相对导入路径会破坏上述所有功能。不要这样做。
PS:在Go编译器测试的遗留代码中,使用相对导入的地方很少。ATM,这是支持相对进口的唯一原因。
在bash终端中
mkdir <module name>
cd <module name>
go mod init <module name>
touch <module name>.go
在<模块名>.go中创建go包
cd ..
mkdir main
cd main
go mod init main
touch main.go
创建导入<模块名>的主包
go mod edit -replace=<module name>=<module path>
go mod tidy
看看每一个动作。Mod,如果你想了解go的后台发生了什么
你的文件夹结构如下所示:
- Project
- <module name>
- <module name>.go
- go.mod
- main
- main.go
- go.mod
go run .
OR
go build &&
./main.exe