内置包导入
Go语言项目中可以看到要导入很多包,使用import 关键字。例如
import "fmt"
或者
import (
"fmt"
)
除了fmt包,Go语言有很多非常常见的标准库(内置包)介绍一下(内置包可以不指定包的路径):
- io:文件操作,进行文件读写,通常用来对文件流,字节流进行处理
- strconv:数据类型转换,这个包名字可以看作是string convert两个单词的缩写。
- error:对错误操作的包
- math:包含了一些数学常量和一些数据数学函数
- os:提供一些系统相关的函数,例如文件权限操作,文件创建删除,获取主机名,获取进程ID等等
- time:提供时间显示,转换,计算的函数
本地自定义包导入
那么那些自定的包们如何使用导入呢?有两种方法:使用相对路径和绝对路径。例如:
使用相对路径: import "./model" ,但是不推荐这种方法。
使用绝对路径:import "mypkg/model",会加载GOPATH/src/mypkg/model模块。
上篇文章说过打开Go Modules模式情况下这种GOPATH/src/这段路径就会失效,所以导入相同目录下包使用类似绝对路径的方法,绝对路径的根目录就会从项目的文件名开始找包。举个例子:
打开Go Modules 模式,新建一个文件夹GoStudy文件夹做为一个项目文件夹,新建一个main.go作为项目的入口文件,在项目文件夹根目录新建一个文件夹mypkg,在文件夹mypkg下面新建一个mypkg.go的文件。作为自定义本地包,输入以下内容作为测试:
package mypkg
import "fmt"
func Show(){ //记得函数名字首字母大写,要在其他包调用它
fmt.Println("my name is mypkg")
}
此时的目录文件结构为:
接下来在main.go输入下面内容:
package main
import (
"fmt"
"GoStudy/mypkg"
)
func main() {
mypkg.Show()
fmt.Println("hello")
}
在这个项目文件夹输入go mod init GoStudy 在项目根目录下生成go.mod文件,会自动生成以下内容:
module GoStudy
go 1.16
然后就可以运行测试main.go:
可以看到自己的自定义的包中的Show函数已经被调用了。
远程包导入
假如我们要使用Go语言大名鼎鼎的Gin框架,这就是一个远程的包。 我们直接使用以下命令:
go get github.com/gin-gonic/gin
如上图所示,可能会下载很多与其相关其他的包,然后在入口文件main.go的import 那里加上这个包GitHub链接,然后测试一下最简单的Gin框架吧
package main
import (
"fmt"
"GoStudy/mypkg"
"github.com/gin-gonic/gin"
)
func main() {
mypkg.Show()
fmt.Println("hello")
r := gin.Default()
r.GET("/", func(c *gin.Context) {
c.String(200, "Hello,土味挖掘机")
})
r.Run() // listen and serve on 0.0.0.0:8080
}
命令行输入go run main.go ,浏览器打开:127.0.0.1:8080
import 其他用法
import 方式
还需要说说 import 有三种导入方式。实现三种功能。
import _ "fmt"
执行fmt里面的init()方法,无法使用fmt里面的方法。
import ft "fmt"
给fmt包起一个别名:ft,在包名特别长需要使用里面的方法的时候特别有用,可以使用ft.Println()调试输出。
import import . "fmt"
将fmt包所有的方法导入到当前包种,可以直接直接使用fmt里面所有的方法,例如直接使用Println("hello"),但是这种方法不推荐使用,会有函数重名报错的风险。
init 函数
在包被调用时会事先执行。init函数的格式和普通函数一样,功能主要做一些初始化处理,例如收集一些环境变量,加载配置文件等等,例如我们写一个调用的打印输出的init的函数的例子:
package mypkg
import "fmt"
func init(){
fmt.Println("mypkg包,环境变量已初始化,配置文件已加载!")
}
Go语言的基本知识差不多都讲完了,后面打算写一点代码片段,根据我自己的兴趣,例如Go语言图像处理,Gin框架,GUI程序制作,做一些小功能或者工具来慢慢了解巩固Go语言的其他的语法知识,至于高级用法,例如协程(Goroutine),通道(channel),指针我们后面边学边聊。