【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这个项目了
posted @ 2022-06-08 14:22  郭祺迦  阅读(50)  评论(0)    收藏  举报