1、目录结构:
workspace
|-- src
| |-- demo
| | |-- .git
| | |-- Godeps
| | | |-- _workspace
| | | |-- Godeps.json
| | |-- hello.go
| | |-- library
| | | |-- world.go
|-- pkg
|-- bin
https://github.com/zhouhaibing089/Blog/issues/5
2、 包:
可以理解为就是java的包,和java语言的包不同的是,go语言的包名和当前文件名可以不一样,同时一个项目默认有一个main包。需要注意的是在同一个目录下的.go文件的包名必须相同,所以我们完全可以让包名和目录名保持一致。
3、运行方式:
go语言和c、c++一样是编译型语言,所以正常来说他的运行过程应该是:源代码----编译------》可执行文件-----运行----》结果。当然除了这种运行方式,我们为了测试代码的方便还可以直接使用go run命令。
4、模块
go模块的存在意义就是组织、版本控制和依赖管理。模块提供了一种将相关的代码组织在一起的机制,并允许你明确指定项目的依赖关系。模块路径是一个唯一的标识符,用于标识你的项目。它可以是任何有效的 URL、域名或文件路径。通常情况下,建议使用互联网域名的倒置形式作为模块路径,以确保唯一性。例如,可以使用类似 example.com/m 的路径作为模块路径,其中 example.com 可以是你拥有的域名,m 是你项目的标识符。这样的模块路径可以用来唯一标识你的项目,并确保与其他模块路径的区分。当你运行 go mod init 命令时,你需要提供模块路径作为命令的参数。Go 将使用该模块路径来初始化一个新的模块,并生成一个 go.mod 文件,其中包含模块的路径和依赖项信息。
所以我们得出结论,应该在那个目录执行go mod init呢?答:项目根路径。
需要注意的是模块只在版本控制和依赖管理时起作用,并不影响代码的执行。
5、命令
go run 文件名 #编译并运行 Go 源文件。
#编译当前目录或指定的 Go 包。
go build
go build package/path
#编译并安装包或程序到工作区的 bin 目录或指定的目录。
go install
go install package/path
#下载并安装指定的包及其依赖。
go get package/path
#运行测试文件进行单元测试。
go test
go test package/path
#初始化模块并创建 go.mod 文件
go mod init module/path
#整理并更新模块的依赖关系
go mod tidy
#将依赖项复制到 vendor 目录中
go mod vendor
#下载依赖的模块到本地缓存
go mod download
#编辑模块的 go.mod 文件
go mod edit
6、分享一个坑
错误信息:
PS E:\code\goland\goproject\src\go_code\project1\main> go run main.go
# command-line-arguments
.\main.go:3:12: undefined: Cat
代码情况(main.go animal.go在同一目录下):
main.go:
package main
func main(){
animal := Cat{
Name: "xiaohua",
}
animal.Speak()
}
animal.go:
package main
import "fmt"
type Animal interface {
Speak()
}
type Cat struct {
Name string
}
type Dog struct {
Name string
}
func (cat Cat) Speak() {
fmt.Println(cat.Name+":喵喵")
}
func (dog Dog) Speak(){
fmt.Println(dog.Name+":汪汪")
}
错误描述:笔者认为在同一个目录下,又是在同一个包内,所以他们的相互引用应该是没有什么问题的。问题就在于怎么运行了,使用build编译后运行都没什么问题,就是使用run的时候,不知道怎么办了;在网上搜了很多都是说可以直接运行就没问题,所以让笔者难受了好一会。最后终于发现只要在run后面把两个文件都加上就没有问题了。
go run main.go animal.go