本文永久链接:
https://www.xy1413.com/p/hello_go/
`package xxx is not in std`
我相信很多新手入坑Go都会遇到这个错误。
echo $GOPATH
网上很多教程都提示修改GOPATH或将项目源码链接到$GOPATH所在目录。其实这是不对的,至少现在不需要这样修改。
下面我就手把手教大家开始自己第一个Go项目。
代码组织
- 一个目录就是一个包(package)
- 多个包组成一个模块(module)
- 模块由go.mod定义
一般情况:一个项目由一个模块和多个包组成
代码结构
example1
├── bye
│ └── bye.go
├── go.mod
├── hello
│ └── hello.go
└── main.go
- 项目位置:example1
- 项目有一个模块:由go.mod定义
- 项目有两个包:hello和bye
模块定义
# 注意:这里路径名与模块名的不同
$ cd example1 && go mod init example
$ cat go.mod
module example
go 1.21.4
模块名与代码路径没有绝对关系
导入包
cat main.go
package main
import (
"example/bye"
"example/hello"
"fmt"
"github.com/google/go-cmp/cmp"
)
func main() {
hello.PrintHello()
diff := cmp.Diff("aa bb", "aa cc")
fmt.Printf("%v", diff)
bye.PrintBye()
}
- 导入内置包:import "fmt"
- 导入本地包:import 模块名/包名
- 导入远程包:import "github.com/google/go-cmp/cmp"
下载远程包并生成依赖:
go mod tidy
go: finding module for package github.com/google/go-cmp/cmp
go: downloading github.com/google/go-cmp v0.6.0
go: found github.com/google/go-cmp/cmp in github.com/google/go-cmp v0.6.0
现在go.mod的样子:
cat go.mod
module example
go 1.21.4
require github.com/google/go-cmp v0.6.0
编译
cd example1
# 在本地生成可执行文件 - 注意目标文件名的不同
go build && ./example # 编译当前目录
go build . && ./example # 同上面一样
go build main.go && ./main # 编译指定文件
# 不在本地生成可执行文件
go run example # 运行模块
go run main.go # 运行指定文件
# 安装到$GOPATH - 注意目标文件名的不同
go install . && $GOPATH/bin/example # 安装当前模块
go install example && $GOPATH/bin/example # 安装指定模块
go install main.go && $GOPATH/bin/main # 安装指定文件
测试
cat hello_test.go $? ```
```go
package hello
import (
"example/hello"
"testing"
)
func TestHello(t *testing.T) {
hello.PrintHello()
}
- 测试文件以_test.go结尾
- 测试函数以Test开头
- 只要调用t.Error或t.Fail就表示失败
go test hello_test.go
ok command-line-arguments 0.005s
参考
- How to Write Go Code
本文暂时没有评论,来添加一个吧(●'◡'●)