本篇文章总结以下go语言包相关的知识。
目录
一.导入包
(1)常规导入
例如:
import (
"main/controller"
"net/http"
"github.com/gin-gonic/gin"
)
针对本地包:编译器会根据指定的相对路径去搜索包然后导入,相对路径
是从GOROOT或GOPATH下的src开始搜索的。
例如:go安装目录GOROOT为/usr/local/go,GOPATH环境变量为~/work:~/code,则搜索net/http和main/controller按照如下顺序进行
/usr/local/go/main/controller
~/work/main/controller
~/code/main/controller
导入包后就可以使用包中的属性。通过包名.属性的方式即可。例如fmt包中Println函数:fmt.Println。
(2)别名导入
例如同时需要导入:network/convert包和file/convert包,调用时convert.FUNC()如何区分呢?
答案是为导入的包添加一个名称属性,为包设置一个别名。例如
import {
nconvert "network/convert"
fconvert "file/convert"
}
nconvert.FUNC() 和 fconvert.FUNC()即可区分
(3)特殊导入
如果不想在访问包属性的时候加上包名,则import导入的时候,可以为其设置特殊的别名:点(.)
例如:
import (
."fmt"
)
引用时Println即可,不能使用fmt.Println
go要求import导入的包必须在后续中使用,否则会报错。如果要避免这个错误,可以在包的前面加上下划线,例如
import {
"fmt"
_ "net/http"
"mypkg"
}
如上在当前包中就可以不使用net/http包。其实这也是给包重命名。只不过命名为"_",而这个符号表示丢弃复制结果,使其成为一个匿名包。
匿名包并非多此一举,因为导入匿名包时,会进行一些初始化操作(例如init()函数),如果这个初始化操作影响当前包,name这个匿名包就是有意义的。
二.自定义包
(1)在目录$GOPATH/src或者$GOROOT/src下创建目录(目录名称一般是包名)
mkdir main/ypackage
注意:一般建议package的名称和目录名保持一致。
(2)创建go源文件
touch sqrt.go
内容如下
package mypackage
import "fmt"
func Hello() {
fmt.Println("Hello World !")
}
func Sqrt(x float64) float64 {
z := 0.0
for i := 0; i < 1000; i++ {
z -= (z*z - x) / (2 * x)
}
return z
}
三.安装自定义包
任意目录执行: go install main/mypackage
进入如下目录查看安装结果
cd $GOROOT
./pkg/linux_amd64/main/mypackage.a
四.调用自定义包调用
test.go文件,内容如下:
package main
import (
"fmt"
"main/mypackage"
)
func main() {
fmt.Println("start ...")
mypackage.Hello()
fmt.Println(mypackage.Sqrt(16))
}
go build test.go
./test
五.获取远程包
go语言有一个获取远程包的工具go get,目前go get支持多数开源社区(例如:github、googlecode、bitbucket、Launchpad)
命令:
go get github.com/gin-gonic/gin
go get -u 参数可以自动更新包,而且当go get的时候会自动获取该包依赖的其他第三方包
命令:
go get -u github.com/gin-gonic/gin
通过这个命令可以获取相应的源码,对应的开源平台采用不同的源码控制工具,例如github采用git、googlecode采用hg,所以要想获取这些源码,必须先安装相应的源码控制工具。
通过上面获取的代码在我们本地的源码相应的代码结构如下
$GOPATH
src
|--github.com
|-gin-gonic
|-gin
pkg
|--相应平台
|-github.com
|--gin-gonic
|gin.a
go get本质上可以理解为首先第一步是通过源码工具clone代码到src下面,然后执行go install
远程包的调用
在代码中如何使用远程包,很简单的就是和使用本地包一样,只要在开头import相应的路径就可以
import "github.com/gin-gonic/gin"
提醒:bin目录下面存的是编译之后可执行的文件,pkg下面存放的是应用包,src下面保存的是应用源代码。
六.go中的保留函数
Go中除了main()函数外,还保留了init()函数,这两个函数都不能有任何参数和返回值。它们都是在特定的时候自动调用的,无需我们手动执行。
每个包中都可以定义init函数,甚至可以定义多个,但建议每个包只定义一个。每次导入包,在导入完成后,且变量,常量等声明并初始化完成后,将会调用这个包中的init()函数
对于main包,如果也定义了init,那么它会在main()函数之前执行。当main包中的init()执行完之后,就会立即执行main()含住,然后进入主程序。
七.实战 - Gin框架使用
Gin 是一个用 Go (Golang) 编写的 web 框架。 它是一个类似于 martini 但拥有更好性能的 API 框架, 由于 httprouter,速度提高了近 40 倍。 如果你是性能和高效的追求者, 你会爱上 Gin.
1.安装
要安装 Gin 软件包,需要先安装 Go 并设置 Go 工作区。
(1)下载并安装 gin
go get -u github.com/gin-gonic/gin
(2)gin 引入
import "github.com/gin-gonic/gin"
(3)(可选)如果使用诸如 http.StatusOK 之类的常量,则需要引入 net/http 包:
import "net/http"
2.使用
package main
import "github.com/gin-gonic/gin"
func main() {
r := gin.Default()
// 返回一个json数据
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
})
// 返回一个html页面
r.LoadHTMLGlob("templates/*")
r.GET("/index", func(c *gin.Context) {
c.HTML(http.StatusOK, "index.html",nil)
})
r.Run() // 监听并在 0.0.0.0:8080 上启动服务
}
代码结构:
运行结果: