【Go】4、如何编写go代码
1、代码组织
- go应用使用包和模块来组织代码,包对应到文件系统就是文件夹,模块就是**.go**的go源文件。一个包中会有多个模块,或者多个子包
2、go项目管理工具
- 早期的go项目使用gopath来管理项目,不方便而且容易出错,从golang 1.11开始使用gomod管理项目,当然还有第三方模块例如govendor。
3、实现步骤
- 步骤:
- 创建项目
- 初始化项目
- 创建包
- 创建模块
- 相互调用
- 在同一个目录下:
- 注意:在一个项目(project)下我们是可以定义多个包(package)的。
- 目录结构
- 现在的情况是,我们在moduledemo/main.go中调用了mypackage这个包。
moduledemo
├── go.mod
├── main.go
└── mypackage
└── mypackage.go- mypackage/mypackage.go内容如下:
package mypackage
import "fmt"
func New(){
fmt.Println("mypackage.New")
}- 导入包:
- 这个时候,我们需要在moduledemo/go.mod中按如下定义:
module moduledemo
go 1.14- 然后在moduledemo/main.go中按如下方式导入mypackage
package main
import (
"fmt"
"moduledemo/mypackage" // 导入同一项目下的mypackage包
)
func main() {
mypackage.New()
fmt.Println("main")
}- 举例子:
- 举一反三,假设我们现在有文件目录结构如下:
└── bubble
├── dao
│ └── mysql.go
├── go.mod
└── main.go- 其中bubble/go.mod内容如下
module github.com/q1mi/bubble
go 1.18- bubble/dao/mysql.go内容如下:
package dao
import "fmt"
func New(){
fmt.Println("mypackage.New")
}- bubble/main.go内容如下:
package main
import (
"fmt"
"github.com/q1mi/bubble/dao"
)
func main() {
dao.New()
fmt.Println("main")
}- 不在同一个项目下
- 目录结构:
├── moduledemo
│ ├── go.mod
│ └── main.go
└── mypackage
├── go.mod
└── mypackage.go- 导入包
- 这个时候,mypackage也需要进行module初始化,即拥有一个属于自己的go.mod文件,内容如下:
module mypackage
go 1.18- 然后我们在moduledemo/main.go中按如下方式导入:
import (
"fmt"
"mypackage"
)
func main() {
mypackage.New()
fmt.Println("main")
}- 因为这两个包不在同一个项目路径下,你想要导入本地包,并且这些包也没有发布到远程的github或其他代码仓库地址。这个时候我们就需要在go.mod文件中使用replace指令
- 在调用方也就是moduledemo/go.mod中按如下方式指定使用相对路径来寻找mypackage这个包。
module moduledemo
go 1.18
require "mypackage" v0.0.0
replace "mypackage" => "../mypackage"- 举例子:
- 我们现在有文件目录结构如下:
├── p1
│ ├── go.mod
│ └── main.go
└── p2
├── go.mod
└── p2.go- p1/main.go中想要导入p2.go定义的函数
- p2/go.mod内容如下:
module liwenzhou.com/q1mi/p2
go 1.18- p1/main.go中按照如下方式导入
import (
"fmt"
"liwenzhou.com/q1mi/p2"
)
func main() {
p2.New()
fmt.Println("main")
}- 因为我并没有把liwenzhou.com/q1mi/p2这个包上传到liwenzhou.com这个网站,我们只是想导入本地的包,这个时候就需要用到replace这个指令了。
- p1/go.mod内容如下:
module github.com/q1mi/p1
go 1.18
require "liwenzhou.com/q1mi/p2" v0.0.0
replace "liwenzhou.com/q1mi/p2" => "../p2"- 此时,我们就可以正常编译p1这个项目了
本文来自博客园,作者:郭祺迦,转载请注明原文链接:https://www.cnblogs.com/guojie-guojie/p/16355536.html

浙公网安备 33010602011771号